From a7acf4398a5564c785b48ae7be3567d8921b0cee Mon Sep 17 00:00:00 2001 From: krahets Date: Tue, 18 Apr 2023 23:09:52 +0800 Subject: [PATCH] deploy --- .../preorder_step1.png | Bin 0 -> 56575 bytes .../preorder_step10.png | Bin 0 -> 84393 bytes .../preorder_step11.png | Bin 0 -> 90337 bytes .../preorder_step2.png | Bin 0 -> 60729 bytes .../preorder_step3.png | Bin 0 -> 62546 bytes .../preorder_step4.png | Bin 0 -> 65241 bytes .../preorder_step5.png | Bin 0 -> 69232 bytes .../preorder_step6.png | Bin 0 -> 73658 bytes .../preorder_step7.png | Bin 0 -> 77726 bytes .../preorder_step8.png | Bin 0 -> 80254 bytes .../preorder_step9.png | Bin 0 -> 81603 bytes chapter_tree/binary_tree_traversal/index.html | 40 +++++++++++++++++- search/search_index.json | 2 +- sitemap.xml.gz | Bin 699 -> 699 bytes 14 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step1.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step10.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step11.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step2.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step3.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step4.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step5.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step6.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step7.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step8.png create mode 100644 chapter_tree/binary_tree_traversal.assets/preorder_step9.png diff --git a/chapter_tree/binary_tree_traversal.assets/preorder_step1.png b/chapter_tree/binary_tree_traversal.assets/preorder_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..a94f9a13ad01c7772521c20e52ac5ccb6b3fdf3d GIT binary patch literal 56575 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 SC0PvM=b6lN>3m6pcmD^fvV{-; literal 0 HcmV?d00001 diff --git a/chapter_tree/binary_tree_traversal.assets/preorder_step10.png b/chapter_tree/binary_tree_traversal.assets/preorder_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..79f991fbc6ea48ddfc1aeedef2adbed05f0fe6df GIT binary patch literal 84393 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 literal 0 HcmV?d00001 diff --git a/chapter_tree/binary_tree_traversal.assets/preorder_step11.png b/chapter_tree/binary_tree_traversal.assets/preorder_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..cd12146e9285acec1ef77d7b4d62b9718f532f92 GIT binary patch literal 90337 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

XN7+TJa3w|FI5pRy5S4 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 X@>RqcrLYkS{D=ujzbX{edHeqXA6K`` literal 0 HcmV?d00001 diff --git a/chapter_tree/binary_tree_traversal.assets/preorder_step3.png b/chapter_tree/binary_tree_traversal.assets/preorder_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..9fef26c92d511a0fc486e61c3317e6fff9dd96da GIT binary patch literal 62546 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%0Dx*A&j| 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�Yq~MY7Bu%& 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

lZ?WxKm9rT}A4rT^p6I?Lel0DvT_- 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 literal 0 HcmV?d00001 diff --git a/chapter_tree/binary_tree_traversal.assets/preorder_step6.png b/chapter_tree/binary_tree_traversal.assets/preorder_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..ed02b8128fa5344ee003fdf62a09be160a935bad GIT binary patch literal 73658 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 z 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 literal 0 HcmV?d00001 diff --git a/chapter_tree/binary_tree_traversal.assets/preorder_step7.png b/chapter_tree/binary_tree_traversal.assets/preorder_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..92a0265215aef15bf44b016bf0b507a273b7f468 GIT binary patch literal 77726 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 z zR$O*mVG3d3iqOB4mGp-8rpLtI&^EKBH|5)*k3#-|l>DrtL4Y_Mf^XnHsa^1Xd|som zUbμZcQRrncS8=Jcy}U|vc`kV3)Lp8Ad&`pvsejIeGJ_9O(#98D4eX>QK4NZ`!e z%*t-@t=@&t+4_0SV-vl}$NqgJWHdcpAgFpHU=F%-qqfV&f+y@7BYF#cJ zU6Bxjwjk0#FppNhW3x8L{PA>9{FDBoUxH3Ukiq6>2Xg^G@^<+$-RaZe<*iWu{0^BO z$lCrc_D1w+5aO;&eOAHCga`#w|HX8)?;7d+D{CtK1Yh%YgHq&_ zd7W(%nP|(5t`);d$KTCZS*8G|r_FJrjk$!P(`cT?w>Ijx#!WRe_a1e&k)ZeKFXE>ho z^eM}o%D-9FmuApM%$&hdMlR3Lm%#Fa5#QlG!JcrDrrV7vHW9I?lrhaKWv}6O zQdC`y?w>9T{_9jh0Yd=20-2FUA=$Jnq8q!SfMi`fPY^NL&9aThFXwxj+C#>#kX`Xy zF?Q-pslWe=@cQ~^jy=i2-BKlgosfWfE#xz3M2~Y-v1~|t$H8*@hzfowM;-TPsM)6P z8d1wR_GaHxVWRra>~Xba%g;YO@%gnoVdgkYd@dYWGPk)UN565G-b|*{$VT9<$p87@ zkaFh+GQ!qt1V)|f!bFP7sXGBTY?}}yOe%llj31qYsn3^*Zq9{#lzar1I&sU%8L_Mp(aK@jx!1v&r$cv6n~CS>;1ibqNH$e;DDQ!M8}vk6WtIF^3(P z4BL+~Cezl=s5iI>jX-dm0*(#A{`k7aSQ^A24l{LL9>fMD1NklOjX<5Tv?{w7S z1zW%bxG-oaTS^QUR|D^byh|SP%W~NF7W1IP>|gJ0@>yShAv&%c!eGxXZ&epd(S$G8 z|NRRpN>)cjbW(S0^YaZ2FO9Ay+ABk2;kICD6_4mIEvF@7XQlIe z#|trOwq;2Ic)n@nW6avK4G-xNQbmaTbv<;Y$9O9n3X!X-m~#zftN~QrW{r>(P@1N& z3E-l7&f|h1;~`P)$1~S&d{=EK(t4j?p4Wq2u)e5iSrqRY1foBvy;cW#biR8}fax4c z{E316Y;gxlCLoN9t zU^dm0gxD9a{;yA{FQX{EImP&JyE%z$cE6h%YCyk6;q3(B5nkbR=vHl5MU%+U>Do*m zexbo;A=)w2a}G(B7{(-Kq$A^?AZ}Sys1!%3t2y4t`@Od65xO(8zmm}vJo<74+7oY< z@YB9ni?aduo!AkTYVW(H1ig(Tw6Ij@lTJd%d4#Bvn_VZ4BspWm`h7dP`M-1XNhGjk zfZ{v9uwe1aSv*fai&Ad_?^)EM;XTT$Aup1^g#gUeq{kpuRV8t=Z*A713sT)Huwj!E zXKnM_9k^yXrr3DDMgp#xvkZ#w!h%t~8uGcR)cA}2)n7hvXn4&a&1O0Gy`LwZRa&Hj zeFDiL2$Bzh3kzGebF)iM+)hH#3V23o&3nf?_WtJQI2_ADP^(_>w)uxkl#r9X=1|5IcHdVxYPRU0-B7&_xhs+N|tz|lWpd4P%j zzP41WaoS)S!1EY)AWU2LHUyc7{1)#1e1}3YSt5h+xGE0%rj{AGJQr? z<9R&Q@k+lIza-?sj;6``{dbcEUX1YIqwK_;pHa*xT-YOk1Fy!(itY-uArxE&J9ovrzCS;WRYekYH3~*mmS+s54z6-{Ri=xNP`ZzI6#|@@-h&h=Ta% z4@T|y*n6`>{`;ZMnk1#tW-1GLQWYjy?QYn}mWBa_0g6QiezxYIha@LMXwPynrn7`! z7tQ4HO-l^)YN2wXoQ>^oNvsLf+f$DeC5Hk39;Yn+ z4L;D}K9}G24f~}=WCR-`?wVqxc6eM2ZVwjmXW{W;jrBC%jRu!VlRRF6NMu)b^52|2 z(gbm9hX##O5BtHtta<4Ssyt?&XkBQZlb0&fJQG%6S0^DTY(phTXYf}$8DYT~L5cW$8c zE9R+YoO~1d?~ktb5hI^s^>d(?ENs-@*N~kCoa<&^_0LP#OO@AY#c7+-vEw;;GrEXd zMjkJ4@*Fs^J}+I*uSX$TC9)hHlGCClXJ#hh;RMiL$IdqsBQ)+J2?@Io6?RMh&ri$J zyFBkJL(lB_X+Og!{4+Tsgy6;nieUIrwqI{|3{x~b(w5KUc{0f66UjYzAd*o>7+t^| zS|Zjuna?)%?0-}ILd(L=0m}S`uVInBt?qz-<1w@#Djf%D<^*5%HTudgSLN^L4U&JDd6D% zk}F0gMeBFcsM$3 zPr2ko;+qX^IZ(wjzIN1)0>N@KW_56;HX2 zB=5LC5JMF;-DvY z2X6q7P{QS~hw!`kk$(05J3jq=fr%mXT}1p|Rb>Jp+}SuK!)9lvGHNaI0$TxeObTfq z)UlE9e;5?CMvD+ink2^whz2d*q9=VTZLK`Ves3|*pRlcCE`cRW#|()DCpk#9c?|-! zr2Ws&PB*ZN|CR0q3i^I5MwBjF%QHvLPU_|BH^1_z#810-)vg9p#(Ft;D$OMzWK+eq z#|-e^ds~yB)P;Ln!Cm!SLDet;;y$nBou(HBnvo5ozS$QcrrO#i? zA4L3|p#AC1#uZ?xnN$>g=8LxHt2|KP8_^Pd7RjZv9UY`n8g8&W5q(yQsMpEqO4TrS zI(S0z4(Dci+?rZ z?lpgdXK0(8pHGa9{lSPGZ!k9r7^uvZ$nifK0!C8?{dJx2-~zdThxjLS68wtk>FF9k zI1U(c5O`f850vSDU2hpQbt_dBwZrB;`7 z;Jya^WK;XZ`1q6c_SWiZCa$G@3_QS8oY(V#@uXJ@%ZZ|ej)vwL5D_um`TK)Sk+hIO z2uFgrGPq;Z04>Z*T?&}0)%Pu;hJ+UQPhdMcEYXV^>GY~4>)6HjTN1u~KZ?0D@~X{P zLl9}|Xf8P7Lx^j^BE*prGqjM47?>3t1{jX2F>(GZw)|*skhM@nL#$u z_^Y$u%e#rXWS{-7L~7-x2;{z%z=}XPnn!&Jt0aZ?=W5IQJ@-58t$*_T3Ugz>WR4dj z1#>e-ES?$uyUr4gjAB@~q`a=>y-|sv*RQZt9`77b&0naI?P|JJa%uTBJiGf>(Y7?R$j@!X_)P3IhZ;Pr^4vcmG$)v0&z?8dk5wlCgX!34~2-EFYl%n<~Lrh(~diPbGKr1 z&uR&f=Tu7BxVc+&JH0dI)McEU*ybhe9UOpr0KmQ>A$)qho)9qTyI$ygtKX+JlAIg? zRFAMa;rD~8-%?XkFTmF{JKNSxS>5x-0O4!TJ3gSzU{_&k;)Mfb_)^}xJoYcZ}`*CdEgZJhf$xRjuKCV zf&OH24ZsFV8w(cJ`muU>U_Yr1A#gp`xY_lv?>tIOyEJ0NZd^E!6%<0bSzBCRR9uf8 zRI{9*qY>)Blf`*yinGY@mm%5nO-`3y7?dXIAs`wO&qgwmJ7c+^JFMpH!mH3@E~Fwe z3?!>($Zkq~7csl_;_2!?&mUmlZDBFMOad=RP&d1P!paDbFm_0m(c?98P~-H&IqxG8 z_fkOFb#~5jtvfOB+@3nPW>{-9#e}+=@@Z_m@^ z`UorrSt+UGxl+|8^{;m*V4ne;_c{DbDKspy&F5gLBO3bnm)gETIk`-7pn%~h;&X3I z4E)5GEAapvtFK|>-&mVP3Z=Q(`04J}=^C^!M*GWZmX$ZrD6gf85|#a5YtUnw57m4-)^v!d1Bai-&LfqBos!&H5_@ zomztmL9E!5KwZB3synP)#2dd@)c~m$Hgecpir%@muuoo4ly4zk>9VRZB;cOW;yzbY!Q*9~FH#)x<_>lq1m|{vt6+;4&E<&eR zq66YB5F4wNq{a@Og*oHuFUxSsEp0hZ`byvXDQDP_A#gGMlC0iJyI3p((`YxE^B{8)F81GH~3 zDD#Z&oleIpcfyY(RTlAoWCdO>M0CQs0fiCpFNke@IQs@TWa2!-6R2ppswLvcW&D-J z#KZuFZTEXsW+`|qZc!`>3?G0lMPl5N??T(%7mP+^i$V>a`?g&`UW$2XN z#T*Hn#3d`AHyAdUDY!wWXP_QxVW=oQw!PchFigG2mKMfEByP?QK=v_~tQthT^1TA? z7XYOHn^ssx`TW}nzpxgUmv6*LEWT#(p@2?sA#5;Q-`DVtb_GHT*MbdimIAr+<;~<~ zN-C&YxS>CP5C#P7+xFKqeFg5xviF zSx23(V%D_lvnS5t!t8ZD{pc!KMEYnB!DzN)DLS@%Cs z(T}P^SiS}>1%b1OkH5aYP6(~10WahrQGj_83#CmOs6ad+-)*GSBTKE8@TBUIqxbx) z9-Q}FR=c{T=dG39k;p;dIH!E1#H=i6G72fbZCd73_9|`^ZKL*_aX4Ri6X2z@8-ix( z-#01*Dowx}wG=G&>0)arj-pnRENe5$b{)vk;j1SX)kd&?7tw8g+{04E{MOrNe&hZM z5C#26yPyB~`P`Q3z5@Qzm~bA6z-+R3!tv7(*h`M4OX3g^ZzjJig%bh=3xTG0(~Pc=8n$m`7a|@zqtb;(216-J zKYaM{kRMT`cIyN5o#ylb3ilXqNNzW&3WAK#r|>4G4h@vA0r8l$uVJgI z@ftEG3+RuTN;_6a|MLJ)q-5$hzt?&7^mbVYhOflIPM=3tj+j&laNK1(+Yo+5emtZa z*+DHo$r^z4gnAI99LjfxGtf6Z6l=nnAYd=RB{p3yA!E6rjz;b%BvINKvD~P7k$gk3 zG4f%iY6@NKp>XMQ(r+mynXsQ05?DdbHkOw)JP#u}bQFe&+xay8nA|;jgNzzz?Qn+t zciWp2-6n9EuWuhsY$>c9dEauv%5MaB-nC6zj*x#J?@OBhEbe_%yTiy-+@m#W%&yGc z8ln6{GRfOZL~@2-3xgCeA@HtMr`DAk0O7v`r>u|v1`JfQcYq3J zcXvdsstNG2$PSOtrvsOwQyb|**iWF;b4s=v!?cndIH$=;mc~(vKgU1`3*!aus`VvJ z{}dWT4o2G@Zruaz$5Qn5Az3UDB2=(+tVF>A<)J_xnb>XdiM8e>j9C-LAQJ~&{D2ur z`Uh8O3Ej9Cn=@+R?L3t!V;~MraOBUY?RggB)I%X+bjv(p9G^c5)*RxY^|=$7!M>xP z|39kUDxi*F-PXn3-GaNj1PvMzB)EHk;1Jwhf(8P?-QC?ixVui=-I>5`);as0wRzyV zXIFLAZ{r(y143N1k&~t*Nqt_;Nq>;`*$Zrc33Ci>N&0s)<#iNYMuwRgbBB5^TjyQE zAw!wJvL zYixBWOGkG~u(nB#3494p%5*Hw}vVH%d1Uf{?R;AG)d*ov{VZ7jw|%%RFc zYtrzu-+iscFc^g_!_OjhgeZlkzwq9qM5X=nYtE0%=k4WwktQMm@NR4B)lp_ra-3q} zuca@>O{=Jagj^J&P3GyAgM%DE7gB2foIT2-yRZ&LBBTSUkAg8nns}w2;ZYQValj7~ zkChi)>&FfM!G8kn)a&em_K)=Q>hEGItQCWG6G7`_!p|iX%_xVT0@t>(%2+BOf1RdJ zj=&@E5he9Dgcrn>uxX|+-F+sw9u0PfL{5HS?as6V(~4EZx?p=YaPvr|jI{~idO$&a z*{e!|%j|-UuLtI(a<;HNIQ+Z+4ldtaa%-UI8;#b|ZFYZ6*)h6!nwq4P~;DnPK~ha@EIMOq-VNdgT1jp07a zbgj|wn#XbZl>|nM4dHXJie6rth2I~o=1leP?2Vr&y5XYsQ}^9<8ejr#CWL;ZiHf_% zsgfxemKA0pZXt(3I5rhwsJ|!Lr3;uaCc3=ORL|-Q^;&5}w`sQgjn+*1~5hc9W$ zrdb8i_*u|DK}t3}x{x>YDUd%sU|(#KGdztueIN?_E2y+)$fx3zPi zg7veKNN9CfU{PpzFj+s@1}uFtx)#p$31W4efLC2ME#2PtE6xA2M4B*F+c%(4vO8XI z1Z&HWyOX62pJx^Yx`0tYHwV8QB009mAE=Wzx2rms3is#{)Qr@~-vMB}gd*`!LC8|# z%mWyk>}>$jZMWY2IRsYGZy~l3_b$w4AY)y%uPHpIz+ER32?07}5X(1fr}ks7{4i9= zC#T>Od~b?J-ZE2L#mtsFoPiDlNfFQauk&3}C`Q~hEm!Y0 z=@kb5XX5pL3W-Ixf@-WQzZ`dFSrehnAxjnP&@Ro8-g0@3`w;9#LVFslP1r4cgt#O^ zzDXCL)Nn9AU$rF>fx0_6uiS#N(g9Z_sw((Ssj9jd3})HK^O%#DiC7!f*4%&7`~}q8 z8jm111;4yqRYGzo;Hv?IW9cP)cDMCba+?yl6=aDA3h+G$RamH3j*EvsrHLrx4=8{n zy^z9h<6eB6fk*@y7f!-teKE+kcK&P{NpG6wHY#tKxWow+2@9Kzp2;)V)BgLbV|or0Ge}l5D@cG&lCwvL z8C{l^1%LSS-`IBD8q$Q#0nTgx`kv9)8x6XyB7URWj{$~}>Xn_M zzB^xK8VGn=2A`uMc%_D!`q7c^prL%zV^{qZVkJVfh-&=j@c13y^a0Purv9!=jMa#!=rn~cCVtm5 zU8OBDdtxPnO`%b&Nn8wzDU~T31qHN95V(6~fiUrg`Jy~8BgU)52pr@oDZCOe=L@hc z2&jB0AjlN`v*zk}OH(Y>s(*>p`O#&syewh~6jruAo%8Eh0gPQr z$SIpvIW_9a9X!Z4uYc=18fBUkqAP@Xl78)wpKsIOE5{1Hu-$xy3Z1cyI4Hf1b#c4W zq%J()|6#nEYh=rZ!OC+#3I$_GYOmT~X@vDelfzwKEZ~W%RF%T`%fA&ZV7=HWCy|K0RW4VlaratAim-Xap5Hu(m~#pfl?li z_jo=r7)tUB$r3F4aUvT*Yz(Lh0q;6#_cA_Sp9?l6e}B^@naA8-|(bbdg+@d}Ho|AgN`Pdbe;?B-`?Va@{> zC{qU~RFhwZBTYf=j;@qkDDm5XqRb42AmvkL7SbRs#qXrhO-|X2kI2>}n9a=eiNa76 z<}d^sBYbO4*rk1Rcjj=35M29Qx!rB}>Rr_(8rMMiN5paG>iO4(Ib02ZQIJh{SP zZ7f=skbcipX5AQ>-c{a;-@pV{TW#&XA&?}h(`eftA(kb$&H%0Q(}Xw3Ve;l(Y-SC* z@HfG)z>0y2&>Uc8$!;Wh?5*;uWJgtNHMzvW5bzful#c09L!7VL9>pLWpv5ge4L8hQ zx%lLVVE@n-p->gH>nu6A`3C{+dJf7uq;65qKJ0N8Lq2|=1j}*&&(zBTlnC$By2%&1 zGZjWu&MUg!9urYP8X$JCU$ucvU?(|5az?=x9U_bH5Dww9bS>fPZG-GCt?&)P=mB^~ zB0!c(NTX?OdR#6CC%J|0`vAS#lOexJjiXLE>oT4uPzJZutm$+E&_yAjm~kYMJ&}dA zka)8=ji!{@(CKl5Pr|vGI&bj`kv7;aAg}R@p%5kGo2ufnk%U)^qYGE%8RJj-I4LJ8 zTaFm{ML|k3C|n5af3X%B;l$H}9S+5*K)rp$gG=L!;IiNUIJmP^{{2lp*9eQLN@Qm? z!O;we<&(pC*kl;pv#g>mDfB6!fB_O@1baUS7tmgq*4D=A=US4Q*t$h9byrwP&leWK za0~@QStybkrEfAIKe575qfR<@j9dW{w3!g=gB%3%a5AbTigch0Id zESMK#;^;gS7tC6Z2Op49kU^rS{9}QNY(tlda0ES#?#w6`V!hWO!*PJ)o*{?afMOP2 z1hRN^D5s8<*e32g@`J6SB-Dn>ij6o4Mi`nc`b3Ersf7{tPz|eHQEs*R-h;uA`j3E+ zxERRWB)~fmL|ajqT(zw4aQ(3|-ZE@;1s5Y5yEso-_v_80 zE7MKX2SZG417>X=NvHCM6llJu;)QiP$vAJR&kj?P8x*(N(wjhLS){M5G|NZpApZ03 zC?82;p?IQ1*2)Bk^fZ{R{er=q_E_HSNGT14#7^R4MUNP6s3%Nxu7?GaET} z&}jB0+SjmR_Y!`kR3Fl-$)Odm7fD!B(2M-gkS(~5XN~%)Ei7P9Fy?_u$-kCIslBrC z2;t9{T@kV=V0h|VIhkj*qC9zI-8#VPk$`NibfB&Ba-=!IAFBJ!glre8q&_tpAoxL# zK2lhEvc66D!xK)dAG2p|kN$TTkJ>khmuH*eDpxEj7^wFzjQk*2Zv{QvRk*>ICEDX5 zr{dvxs`Df>>1a%{O!%6dsdKF}?7P`u4kNmS^g44A%-+cu`=bZ5=k_rYypkBojtp(# z*3?r9vWCy}PL*(8hUz6k?2a*?c*gFGNeIl2T_*+Rl;*$b8n*=wrKpnCqPS8s0Xr{p9db69R$># z*r9{~Y**uk4{>#t{qHSg4M{%-Kh&9DVOkX=COged_B|!`hj`oxgGwV9=oMdNA&FB7 z?Lt?yKKo6n<9L@#>X35|5brezxkgly8YT$n?|Qy^Wr&iTdE|ZaNAI#5$%folAt!}w z9!}aIg;CzQ``+OcEGsSSUegnT6iVJ{=s#<)NOWounD2Jui#Gr-+ z)h*toNQzZ3@-D&`5Gq#B7rZi7!VpmOF~^z!lgk}%U|wid7w2MJ_#ygL zM3h(d^}%Zs$p#7r1gfqugP!n?#<^kBU6~Ya%Y-plIIzVODP@voVy z(%b*V^phGv2Jf<53o$02hN%5BvFm(s369I4buax?W5sM=Wi!P5d4|<)1r! zMfjFf7sf1acbmkpP$9K~D_Z`J2rBCKAK+13Tj5|RLC)KCk1W!)YJ3HlW;0nhiD@>s zYARFUjkq_+kwP9bxPMYN_|v;PTU1Xp221#u0i`;VkBM+bB2Ca4CosBbw+W*OA~~C8 z3yY+CXAE44kW*o{R&>64Wcz^i;T^kZ2#Zi;zYA@_xB<@IJq>ZDeFVODOXlC)0JmO* zT9|Ef;Q&>D(9JQAWXpP?Z;idX@udiUrt942Zib9w1;Hc)ZqGe1H;G3Q0(s+Lr0qMo zDgedBaaGxH-%qEMp*(=MLRQ#{>SBk?6saB~fPtg7*&c`z;X!Gs0;+js`S8`{8rfzD zxxd7XXhZ0Cf%*_h=^FtjlnxrIG42=(FH!@OYXPb7@*5luw%+b04?NhVL zFxoVBpTwJ^v%Rslz)j`=zj~>M2J4l+3kpx2y^{USq1yYfxw$#xV>LHKClrdA3Vx~3 zBI2k*cmTWCTA1ZPv@70T)OB?%L0e9acsvA29EM@)0A}T2T&U-r6wiBcZ_=XFJ6+_; z)}pH}vW=|{|ATE=@^UHpFb2pb5@DfxgHuR~I%#L)lN~C}F(KKah6#M_t+Z`72~J$- z%iLh5KvVVDVN<8!&Tndq1#aVp*dELQ!){yy0tA6;Zf2Tk@LbYY-y%j<_Wq2_^%WIA z%NA~^Pno?*T@Q)4xe1Y`U00~I>~23dPZGN;zN5Jw;!6%-Lw%Bg$P4xqk<#b%!rU|# zrUb{Gw%`!?ZHEzv`eQu^1;=P6W2zbnFJeZsVa@vy`{g3Ngt{S-J_8k5<4QK`Ky2Jq zL?15xpHr9}*|zPs>Sgo(+J;;#*3zJk=QB^h4Hm#z_wWQl^ooK3Y}Gl?L*Y5xx(M+sj16Svg@gQJ|^USQt>J9w(x!hH3&|& zK`ma4KtA3z2p2{Untu^A_l{Wnb&K<`?l8%r$e~y?O$N0k?|(f z$ZiCh8yoXS2tA31ni1AO_IXqLh+>*$2$bDXjn%UTV1zjw3mfGcK6k*L9Z9q2e%kSd zo!&1{=fQ1h+z~Gs{W%%M>_b31M>1wWC}N;N3^tvDZi6-9ynI%sgBk6wP3Ev{s&5_@ znMgrmO#l#te|7z{;a$-j)lAKWqBQcW@-^58vc=b(ZL|{k6(Y{>3n?b*vY(D>fGYXb z60z`}N7ZNF!3HV8RLfb`h1b1hHI<4$=tR+7Sa1)7os1V+$6tGPEaQm>DkGzBKjB^x zt%_EKF%Gf>Q0x~!q9J)za2`dBPJE%Q`ss!{ZnTRe8;5Z~f#4TVV*s*l6XGZAoQ1$UJYIb^nFbbRz0GwCyU)nY+FUKOvrS* zHRmdB-yHlUKWRGUvD=L!UBLB@3=-myR9%d(0glLNb%9C3fHN;fh|vM2e*q=x_FxSD z9E=;XT$d$)$MuNS>P=lhgSy_IFn5Z+4^zsGbc}KM%ULN2iGw@>*+WEQI&(H~MrrS{TxapH7C@CtP-zD0rk6l8!`#DNC%^GS9T*ru!ewOZA)M2Fs->StqZiv8qA(fik73aNFz z8q-gnnE4VyPN<)G_swqDRbCO%U*SDIDC}BKPPbjEf%P3Xgj9#5!S8wDLJNXKfdoU2 zb-P6nlhCu{ad1mb90s*rJ@FzpumV%*Jn?l}M>;xNIiqp%Vr!rLE)l9%ABHXXnm#Kd zs<|k^eEflC@&W!0Sl85{E_fAWA#gtx=ZmFIi2pNbBdVMoFxJK*R9D4(lMK-Xi z8%)n=3~hjU0x*;d!U@*cN>xfq2w%vB=m~7nvNvQ8FU<5IdIGt;0uAa<$XegxzAfqy zzHK8jeB^x!fZjH4JI3#PfYt2-e>W7u#WW;YfhKNaxUVEtJq0c=IJ?0{M%|h9e^?0i z03rB0zK|fk?-7eIJpP3`MEM-5;KJ2FV8fH8no2n>ZLC0$){naK92}kC+)VH~-3Hqa zVv|m{S~10>dzkN751Mfe#u;4hKM~PuJ@rj@Gurpv?J6tYyXXoejgL?Ha*i-?cqY9#*{=w z7ucfe`b(#n5orP4R}~gWL$T>6JV(Hme zt(C1zJcnjV4EtcpsoCDU!RGEhQK)cF=A5X`0!j+5`tCP&dAGy#o4W3%LKt~)AzJj0K0_`zSQk_^c3k`e7?fUZ7AP5|80f#7 zFg`%L)kt*J3L!ki?6;$m81^(~wdM~vD1K@9{1S0?c4mJj^x|ei3Y0zQP&y37Pp99K zc&zX$6WQ#&cKWF^16GgTny0V24b;lV8d$yp{LCPN@#lUe+1UHeL+o4ACl2!q705s+ zkGM0HHd@1oh#{)^4;hLSsCcJ?(s|shv?#BUr!`4G({{J?w(oKAU?&;411oEUl;twK z#VHo~wGo+UMlSMu+2tULdcfV`img+#ksxG)oIEpq#Fx#ADm=66FWiG~l2yN7d_z6# zO_(<}3-R{{$XkHg!>XauOw!v$rJ?S7DZY^(>Obf6KBeC`75w??3w+2oD-gDCqJz;^ zjUvGyEypw7p{`D`t1QgL{$4>8GB3C4cc~;%()$rfmH0e@(xBrLfQv6i=<9XK6Vu2{ zb@GT1e|v|zf#1lxo+^6v1g0>CY*=-t9nmvTzgf}ys-t)JcFc7*oaWy))csU)$h6*@{>`W5WA+O9#&Og-Eh`YA;mSXV{aEa^(Upt{taPt@^HLiCT@gfZ>Gf# zaHEEF)Fds1? zz2qP6Q(-!%f@=bv(=iX(qi!AP3tW({M*G|bA%|rz1fSNppVF`vcdZ5&1MDe?ccvDEUF`= zUx;;i3)j{S>qptv29GamX@_tUzDI7IH0Bh8w&t!kST^n#sEA)3FK%q<%lK==c*W&c!U-6@vH6B%t4@!r%@8{Dinr?uwE()3 zkA(>~lT!KphwEn}73I#jnW|*|`!42RPYv!Xf(1^*+v?^(s+mpBO}b&hB99QMvXmyy z+UcIPmD0i=$B*6nf3w-xl(=ZtyM!+9J#=i*Yea8|g$)=X#fD-~r!nE@|(V zd2S>LYKClH3L!13Q`ZXQ<dg{JIu;~t$#Lyvc`m$GT> zY7truX+2*ae1m z^`Ibw9h<&J1``(Bqq$~d#uop-AzU$pATFprn4ZT|`kFBU%*&e#N1c=u%CTw0KgoF1 zbX~E#^d^PaKY9NZDextSO7>Sesu@9_&E{Fxzur(M|4wPQ2IHbdeZ(9}hOL-|bQrof zL-o0xocG`B>%_@$xay9-Y0DfN!ic_NKLN)0NE{=*)o z3MZD?2SLE8Qbtisn|L5^v=kdIIw!x}4j^PNiL0ri`NG6cfG)_88^1l0?8z7X|9pf0 zj1zD2K@~PfZ7>!Y@spEJ_!v=$l0bD&2nA;5?UJXR$Fw_Hs5#_G3sTVNP-E}YSb)4= z2G`R>nU!<5WlP+8i~MFN4p5)0;J^HF`OctQZ;4xDOSw&X^?**q9d^&ecpxvWgu3R! z^8N%BJgh+Z!73`E?7!#v$x$$~Fb>$g7`pk2>*{cpK4jygDNj*g6!ncSN|QL-HeN=L zNpG`x+zQZ9O=JmaYnDgz5C|^;YOPPO{B@5Gj$tv*=U4fqf|TTZ?|F@04(l<(l68=_ont{B(_&_7%JyiJO_g$K$qu z$*Y()P8C%@NPOJ}Y@62A1dF2G&BYUX#ygcgv9vfBw#ylRl@$`!7@^Xq4w)=*}c)tR2 z7^$nj*L}_2&v){2ayW=OJgkLihZU-pp`}X>ACa`F@n{?2Q!EWc8)hslY8P!3$uuX* z#c{X==N}fUO{ApsA(wRZZ`2Q23-jkJ>)V~aM-2NsY0_4NBN>JHfl1IL0$2W@9ET#VLQi*I1}8}6PhL!9b*V19a-sZmhJvLjZz@2kPfkx`c27wsOT^iq{#Z|x zsPKoxsORqwMZyw9KA7e7UXWRp?;U+w?<+&0`u}W+|HJq|fuw}c`$_vR4d5%SY1v{tlXK3X$G&j2gz7=IZSDPGi z3VU>Fhp5|7_pjphAHQ;WTB%u1{pz^9ynK1S->4mIufv*9gqXMUk|}dQQlYfFT3owoENY?Km6$xY@K-kX3{+G&!RB>*GEoZ&J-lh z)=grQd)J&dxkFozQ}Z4EAA~_H325l>%jpMEa=FZscDgOm;WNMd@K&>EMeXt_S7++O z!omW;guT0;&@xx+pRSj;Y)})>&-9hnSO1YYX9vuHAjWRFlT=>P1zmZ0c-)Z?tnkPL z!B4O9GRGys394vhFl}R?i|Q&W=1brZ34+Y~Z$gm2Z6pxZS6u&09~b0hUe)yV^7P)V zoM$Vtv;E8QA$9_Y?V%7#aQ0kWiq+s*ZY@jYx0UM!KFBwy6AFVKf6QFQebw;cHQ5Dw z*C$XS*Vfc!29q4Fb)y} zkym@){Y~q3fcrC$)k$CO8ZDszzzrShWzFLfOq#?Cg6?JGWa+)09y4Yq5`%Z&2p zdJ6lB&iO8>sD`9<^2+Oz1u`FrmwBHt;pD@W@$@ z8M|o=^h0Hv-5_z`u&lcNS4hYT7!1zKqsGC2?68=jRfL=+N1UH+LW$~z@O6tDVCSXM zP>y62MD};tw>KxmOYs4oX;M?X{eL~v7zR1iYJ&bjS=%Qj+EHzv`GneN`_=C;te(q9!g5_D+_*&fmBMnQy%u7@0>&^jd}Oi+_;zPLJ4OBQN%X( z*I)D+@5ye5{bbSiVqWccZu$-g7%)qYxnbf*K?+-i(4a;yCH-JvSZU|UWp`xPV zMVJE9*yGUW#z_2BrEa)$0s6$&uNpbP)^ z)!Zcte8113I$_$Ne>rRs_v=+prRJ{X7M6b&&yOtNUDJV~!O=+i=G|nieIm>jbhrEmys!r5y0zzz zp%PXfZl(WA+$5Ix-dfY_Y=|0+IA5=RC=Ab?AX~jS_oj>CiK}h`{_1AECD~VHfSemk zwxiMay7P-`Suu;}!{k$C#C=$XORWxnmjD#Gs^*v9gjs8#CY#;>9apf|?cZSEm3nOj zRcT~lBsi!mM}7ifC&CXvKEukz$Ql1%q9%U@srRZ&&xZbfltSnl$jQ@6uVOp;PPl8; zSzS{z4End^(MXzl>&OR`6V+0y{42VMo!&dVPy!Z4fvPIEPPKU*z@61Tu-i{bRYL<9 z2sSX|=aG*(wj7@24IMCh%Pv8nn;b@%$wiYA^Fed{v0zlB`v_c{+e6g3-S|Yi|8zTEBf7RlgoUO@hi4(*PNG6=N>IFajWrTEnJ~=XPJ%#KG zB@M<_-56^Fm$hgqKHIlL|0vNR&1jN^O>{ZG8AjR1rlKOqsb8$+%f)j$ggKj{i8#5# z(b8FK0;^MSL8(5#eX+_+=lS2E1OO(bM|N`SNc^MTFO$-l!tQ9bTm33qJVaaDR&F(4 zW&{OT?|uFJ`2uGgxV}IqTA|05aMXD}oVI%Xg?D>v3kt@rE-wR*cuTeOwRH_>?WnIr z?G~%LLH6+p2_J+#xB(9j<@KzYPJySKw-asR@|Y&)t{*IzhO$W?J8FOjyQB@$LkI4e z#U**T|939{;LpGBqhccqlD5VNX5X=vYfO>h5Pt4PL2O%C=DD90IksY;t+l&4rvDEMU_uqh z0G?5GeI$qXtJ+9Cz92Yh!2I5Vqzg64u2sww$rfED)iJ~HgoU=>6H*6!AGZzzQ~B(q zVP=5!k$9{4`sK?7pKi@YUS3{Z9rut-cX{6({YpyZ=`)`I+PS?tUa|btavQ}mI6DN9 zi+k@b<~K?OM_v@LAA1Oa4FCeWcvVI1yAO|zp^ouIp%1{S&F1m7i8w7=g*F1TT31wp zwF+CwK)baT+|J*dkgRNM=j)qw5z_p~H)#SV$2wU8CrrlF8;%(KfMam&gh<5oI>!!O zhT9fUkwn~G1SZ6L7xX<*XA@n+`>+8wfqTFW*-f4v`Q3o3Yrw8~_iw6g3q$-%PUX9U z3^E?`?-M6rt_|RrChp{ttA7l?=We$TH97alR(Q^+Z?bv0alh`pb`pRNjwyOqEegN? z3ZwfwzW5I>$FH|jAz_^;X-OZjEBiVM3JL(@GWH>d?Ewah>3mbpEv!8>jVC5LR@MsN zw^u-rH1Hb)({WNW5+B)~*Kv0nsH2^J_xuzi&oxL7(B=HeCujDm6g40DLcNayf)M># zL&bD-RsbaXbvHa&*ZoLj;=~=<#ENylVPC=#v;8S9$x)?=r?Ow=VK( ze9kW{G&eW@8qW5yZvQ$ZCqnrr>+l&J!(j|`9BB#`Fi<~})mNvV(Y_0cPe%X@> zeG--e;%GJz$EGdhZq^$2Bhf=&qQwnYdY8DUSev=-62_G7+en;O zxT@clie!g(daLXnlM{>Ivt{9TZ48J95-$HXC4GJ{f8h`%WMem`2lDgja%diYSbu<~ zv9a-|PyTt}Hi?yGRo19Aqxz+W1+~w^PU&Cp2dqSKuL~xvJGlMoAAvrBi*~VEBK2<3 zjYr`pUt2HfpYacpyDlj+CS;hv(t4{dq4s;H_O4+-5Mfc+6Zr$4@-HpN6%ycUfGb|4 z&V&&EagF;24L`6izvQ7gXqLfg(MiU9ym0|$(G&`?nV=}vVb`()uVkCGOSwcZY-iK< zXEAB#F?c=)^d}VM(xcN)G z5V~NCmCvDsDJuQI;}tQQ!3;7nHikpHNdd9*@q$_}x&Er+#)N%gmP6^cfI&LFS1YS4 zKC_eItJl^>Z!95O>2&cq+8yRG^oM{UxcZDF40zT3IozSF&Vx%=7Zj0ynlzMkFS#KG zN#i*a@8rKf!T6!v0cLMhoF<{uC^Adge-~a4=$9f^HQIo&&uZXn(l5B*EGk72FN3n4tG)XS@U?~c|d zC512VxvD3*n5SRwmN0Ka!}vy{v((V1%!Y=u<@(a>Y)I%X4diLVkp9mf7sJ*$5byKR zzeI80M@7CkW>$CH!2x8y04a|K2kq>THJ(AX7x(p9vJD*-t&%FlUksnJ;Kz+o?U zV58oyzYH*XY}=3IS~ZRA^$!)w=0GEzJig`ZSv#B(4jf=15_Rm>(m)xz5s)N=hcekG zm=s$E*{n1$1ofNN3RgKkh7=47|7|(u_3~_MZYR-3y1jF&CKU{YcE5fd1BrS32gsNO z;}2{A6JWOScN<`O7906R_D|M7_IozU3cxRD9LEI-a$tZm4Z#`U%J1*&7?N?0OT(ds z$p^|B02XlHq)Wd2^4X~?+ISsw>p!n=S2XMTsYX@{KL541@R|jnGJ&v2tWoAazif;1 z>-Js&WBpoj&5}=rV8PFi?MtfK+E0KN!TDk}G!#46Iegz&6)6ZZtthI z^;z1A(_^ULhT~%AS&ISF+n)V>ufMb;LJ%$#5G}avr@Ir zVljgBPW+6$xAqTwp?_Brlp5*>)TK!vyHLKZW}*mL_&|IUj0q>{N~nP~`Cy^7*bR zzC4+SVn@dwkuu3Lxa5dt!YLyY@rkxi5&?!YRI23QFUEld!X`@FyR{E6L-IQl=yS&8 z2O+?~Jot3`RR0dIn^?Rmxro^GhbI*y$9j@#bMhnIW}su8!uTC{1n54b@eU?Lp5<=B zHsC&l19o)}p4Iddtzw}4Oy2=IpG-HwbbifmO=acsiUxK%&*{6h_>^|9r9O)SjOF7E zd&DC$wi80F+=P$IqauZ82c5uWFqw-<4nX4DUg!V*y*gsde3DMWj&Kq$-FmY-SJ>R) zKWcqDClT~CSk^0#7IxC9p&n^r9tyQ)hl6equUwtpU|0c*-%#)Iye43G-zNYWJmmg_W0=Rr` z2x~p@sp)w?RIT53)*}(rZEXSmS}zB=F$JYIYNt1fWBScaEw6!GcrS;$R@1ntn~xhy z*Tb$WXeY;~Pe<7r`uu;!(D#wNoq4jDpvT~W3@JlEpQ^Zy2giB_^v(4-HREM!SY7`z3jOsSbg*8 zK_bqb;@yzh{@5+6RB^rgtYKs0CPD&Q*q8TtIEGC#;U>bOMS}RXvtU_Cagl46OI7*c zp6Tpm2C6ZnV-Ery{kFfysFD@04oi(XPJuz9!-sA1>+`XQW%*F7>a+y}7@Ta9zFy=? zk9GCj+3q+)obsS2Aj{o9Sk~FgaMVIw%jp{$daWP#ndF9sBC8mK>}fJI4(+x!^W|jY zWo?5&MIx4HQ+~N5=9gmb9FbBlGXL=70AGhufihFlER%)7n$`7Or4J8-3K{mo$>iCS z?-9sUI@zRfd{x=W+1bLo1Gv)G0HsoWeLa!(0#z)JusrCgizNr6s6VV+~mSTp+NC#}quRnCyO8?Nx zl#=NP{QBj2);#$1Lm0Db*dgUJU-`o9%;I8FO;6ujyMC*S%`m6?zfqQ8^|z;S*N$8| zibKMGDMdBDZ$9PR&4%3p!2EeH+4JJy^alkr2Cv&FT;I2dxK@$Vaz(TI@ic>{Y+w4f zhXvu+9w%W6GDsL!9!P1wK~Usz^lFmNO;n7j2U0u!8vCDYzNd}bc%567dmtFhc=&2L zY-~GWU0m#WlycwZadi<+$dWI$Bm^xB)$*(%>iM3C_eunV1d{vB7G__pZ*AV%eUFbq z22#z&$8?j*r8lwO(Drw%e)pc+D?CZiAVfy^k$PIm`_*hfqJB;30d(CesCTY%T2}y# zKrva=xWJ4ene*IjP*9pVP0Amz1@VzgTU9Rl(}MFjo!F6gOthw%N4OX6gNqWg_(-Dc z=G6iG$Xws4vxa{i8dP-XhtUS*k0*o;K7(QHIe-zNoCn|*>cHRcTYK`<&h~op-G1|r zqsDk;MeR~xJZ8$7Y5Qrz3g;V|P3`M1gR-`|o8_g%sG7`{gJwWE2H5L#=M_>FM2vBA zH)b_}>@11nkb=fv6_f}NsCTcGpu9pIuXz4}T>0rZGW_{J||NB zIxb)7`4-AX3__Itl}=2Wt>@5>Yv=pCA`|Iz8*$Qk?!H@L?)!AB$5!A@ByKGDN3@)d zaveyLWsiLeBFECS!AB3T#2HVow~F3xbmfBSXPyl46HkI(44eEP2dbaZ1drf?G3^um z+>cscH}-)njkq%7e5rO241TI`ZMSNB%5upjknu{9hVXa5Cx;-tR=HTMhCY8fg*I4j z%XYo!xjqPo@;{1;HHW8hVPz1X8RPXh%4*K#sb0Le88Cr=^O(5q6m-6DeC8E)BY*9! zB{rxIm{sH)J=1hz%QxP9dh)Qkr`BiM@S(&(dwHqYzrS}OJvjxhj_*GO=6ZjxekoW} z=0se2bzNkEPnz(F?sw(Sd?{psxnj;zI~dF911xAl)87tBa?jeYhM7vVVvgQzy9SDW zVU`9POHv|{`*rQ$86w>*W^61hE3V!iv4!Nsnxi$k=TvvLaXuTQV+V%vwSiFY3Keeg zBy(cz!P&B)Nv2b}4IcBuMN-EKD|D$IgQZLG--;PuA@ilD!`ybOkt02K_vZOhFaT1p z&Isc6vY%$O;L4u5wWr21nBr2$_|;!#uD-PTqD=qy*7ZTTYiNtW@%6)a4*E%epAO88 z%xlc+LCmbqi;GaS_j_&V6+H2#I}-%G?OKR}v;6>@WdVbcga8<$nt0+x-`=B0=VpAa z>r%1j#3Pb7p%tImj;@Qp1nlEaHF!GfTB^&A4#X6ljiy@7^=y3y5tXlWJPlrsKx44k z|3b#M74@GpwA567&Q$}qxxDxcRXkuqlTMIos?kZx=X?(4$y~kGrN?{hJHg%Ur&*fg z`gK42Bq;PtUfTUf^9x!`4cAF@mn7b#a;!G{&sEPNvdYspA7SbCVB<)`VmwG-ql-ZZ zHJBeAwG8yr%&qha(|{H|&6%ra7PF%R8C|Mgey{5YZl8O6uogWK+-16fEvYCH(sH}n z>G(68#sk28%+$Rc2NudwT4XfVT)r3CNh>YY4VOfk(rpc-d#A4(Y6{O(9VJh0mMPtH z$nwt ze9%(N($Pgz%`OvHbxAnpx;Wd_O7ojKt@OM~P4wM^7I3J<5HqYna;pn=sa{;aQ?Z%a+zM}D-ouTl zw5KNV=;cB`JBk#&t)|9!7)x;-Px)!I%i{QR?Ny|s$9AE1#y9AcUJ35~6$0;()d4tR zy?h~Wa(jf?z$ZiNe_*E;b&gWrZ2HGw^;yE=4{z7x@9Ctfj`zzNxk?49r|Is6i(?c| zV>(k8o&*-m5dvdwoB$qMwp2dPaRE=}hRO7+t8NfBPd(mzrrpyVG|?Qo3=wpGXZx8j z?w{lJO$U61*^GFLAi7cDq(zd#}|zdn{aNxur@-_n=3M?c#-)2DR?arBD@k?AUCSNPlAIA0ZnE z^LFZSnQ*tA*?JWsfGeQWZRIB6KAz0q<1TX1#uIA4USt8dh5qLmX#D}p&<;go zW~`U4uQ4w<$4Q0cF6LupzPc|3@xtu2gkxQHEt3mDHOs;dn9Sa)?(H#6k}6xyj>-h! zKlACnb+?EH^ktr{8#8qmWR-17xC%834@fJ0BuHr9Z~rRnslnX>8h8)7cl@>*2rELE z*tG;b*w<~7O#gQ~C;fXrJ$zimr@{)mw(s@B^aHXteb3gE)m5EjX2cDQ!f)ftmLeG> z3>@c5edxv`NH5uOw$Kd9G&!nVxO2OIaa?3X&oo+l6$xTpdA1p7IjyzsGZR+7Ixt@> zW~VDUr)#Qk+@99rE$N2XtOncs^ful$L3jEP?Ji`OISrm*T2FdlsnP0n!*z_faC?mG z&2!EMRp1M*tW9LzI(e^ms)6xAt?zKBO_@)SpPj9 z1|H0h2?oJ$@PgYJ9kt?Z%{LtdttiTLw?1a$VjXJjA@w!?c=_3&#b6~A9jwh^`P80n zBa0NsWuPor`mr;=v%!33|E_(L7-|7P&M3;`wPN;T0GLb$ttjNn{ilGgb>eXfE#Ea+;sVFAP^0_zsT?wesWRU$~OOu)dt;%}LWATE$m0ZJ&!9Qj8Xl;w)8^7g}Si z-wv$?^}jZnxIBh_94`;d-%|}t(cv{o#v10cNe1@~>$D1+5~ot;8=Yr)T(}Zz#Uoq~s(IYzPfblt3c@;+qgk$56azVg?=}O`t<6BwYc1!fPSIt~ zx!jrR%qC*POf7E(TvzOvH8VV9BMz!ytTWd8^UX}TW7z5De(h>BhV+;p{3m+8=9`n+ z+UV*X_3^UhmoFQ~5t{bfGf$J{elt+>v0 zuC>TO{8=An(4gn0*3P@)r zL6CUircHnWs43O>m^&$Uv3?X_c?&2ivc2JF2~+=gxqj4u?tFg69CJNHmJshQO|@OC zm?apvCnouJ*v|6haal<(^lDav+nN$@dSNHm73K(wFU*4=&aN4a=}oCT95rQ-S`8Tw zyWWVR%Ch(z)=#Ksg}cW})vrfMej4)cpK^*Gv|*FHT|Ez-H3rvYJ2y9CgI+{S@{?+g z@%Y+9Y&QZfN0LbnG;IFyS;0)t2OXLd;hIsJKYvH)6#Th-zW3Xz78zalhmw>jM{VXE zB&e;4hElVmpxFq>5977zF$B#7-J?QyY^lPgT18U$L{Dd{6t~WQ^iNfBcNG$l>m==d zq9(#$P`W1TV-7!=r8E+Hi{P&~y`UQ}cs08Wa5l=(E9UtX=JkfGt=8;wIZt1HaKy6N z?CnFkP+Tirx@SD=ZqkH)!y?WDi$k#*o<^8^b}3$N#)G6A6O*@T_xDNZ@2(z?%}oU- zwe!-2dt08iPe9N6wIIU9KTc8O@8j%iGfH;v{e;zv+7;ZV#JJ}-kQo#1KO(ElWl_YP z3wC_EdgHeoycGnLZ)FcAqvMb+oTxp$lq)I?z2U*LCt6#?Q(6Q)1jlkmzA6)47KsUmp= z{K-gdbg*H)y?W&(najwNF&}8J2=`rG#VRSi_k< zRjD-!irc#`l?b&;2Pt^l<|UX~jl7Z4>ke~x0K2yqUz>x3j$f$P^4i%nZZrn0o5!i2 zW6of<78Z(HPgaig>Xazn07D$6B&s}c&Z4~vrEQUM@_FWSTs&ic$cL=YYAkqYsdg@= zC_8t?WoB`Ej)>p-^}m!G@X@aL0cZ5f=1HEyVYj}^X&1f^!f^8>@C(tYg<*#^oLP*W zg%m7mzWN#d*kQc9)|~mZo?1qsG4tHs>5Krlzuc~RC6cOO-_1)#uVZWBl(L|{pn^^L zZGA!J$)Onso%g-%%-i&~t3s#yn{&s2W&YOU_CyVRdC=>8f*$p{)@((~EJ z0F&*ptgkbRc{kcYGy2@rDGU7m#m47eg|#q>oy6e2V6_aXjUW9*2jcphG%0kY?~wRb zaWN6-KvUf)&3P3ik+d zd>`Dql$P&7fFr`Z6mi~2<~0?SJ9VWu(|$zLFd+~7d@MV-PsXoFW=e6)O3Qw`5nD_| zLX0n-c0Ce(Bk1+xP}7vW>vQ7{ife1{?o_U}%xz0m3YXU9cxl;nbbwCb(C~LQo#OMV zw|ekQ0-101d}w99oTXs_KEa1U!i(kY>2*HglC36WpF| zzB1M!DBf)N$k>Kv{TtImVPx3dH7R~PlBD0hAC9ju(8W4O;yjXZqL=6ZrPy^L*kCt- zTCn_?GSfHiw(9xf9ORgl6wl=_5DYU)@p&|$mQc5Hcnq{0h1=zW8}sw$*0rV=Nw2<$ zt3qJxeGbLw#@tJa*MqlAKx5}`1L;_*N}OkXU-n<{_-hfedOJD{@E2xskzg zZ(IxRat%e=U!&#y?O5R8y4~7dNh6NqRaqV8&!P8Re7x%lRxNCgae8Z(XAa(3$qbH= z3FyFPI6tt34!;vjt5cw5qo8fA&8K*nizMr5?~2)lK;I>tfGLj7%h) z$KRXtX>;9ED7|e?ZeGM;2^M#2)uU`M-P_?Prt{#T?IwT7ycs{2@$}oU3>j9pSNsJ7 z*GAUL{=3n{sccgW*YxDG^&OK_^Di3S_UF4!v0(w*YuT{;5SVJEYr*O2LG*;0ZCOG> zN{PmCOy>|?IpL!4bIO+NXzyYl(}m9Vwd@bYC4E#DXuBDA*H=<)n8v^yu2-useQoV-*nUA&YJV(sRGm(eq)77 zsfy^E|S%?53w-SK@l%dZ0Ik7?5Zy19dAGz zZmc#tRM&C<2xsa1vN%W1JvO$`P|n0H@D7{nEjt@wSN<2u<*%Asn-4;nlOyf@EqOUp z8sC{|m~@8MDWU02ajZ39vva#;df*I}2>OE9ZGS@gc3o`(j48&Yu)417s6`nfr|@$( z;U~lNZr>L&y(d}yj}+lSYk{^AZrBgutl%1v8Q_oj6}9VmqsX73M<*6OUkAQu_(-j*JTBEpxP zYRm<|Qjh?x=&ez;(?lzMUTDtLo76TxR|mo^4T}VXQ^UOmuj3Qi74JcWeu+XbDL-Maw<7d6K+Rr{OjTm(EWuY5tlt9$|9GWz&xRyQ8vq)%7oAS`u1 zq|Lrz82IfpKZ^pCWx0S5qrsG-P%WBH>|{DLqpp@mL~pvf1s$529Y=zQQ2-617wD3+ zL$!#d1#4@u#n>b<#QO1FK=;(`woC9(Nfe@z-dCEwF~BEXKgV92I5xwea7?P(>@Zqr zJw1GYklxIFKEpA>m5g0RuxnVZrCI7igE887e{SrI!$au0 zpcEN2ugaadGT8eNI=0sYBeie_n_lzuedrTqJgY*lXyfFpZ!tB53Si!XTMbG@J087J z7LV!dbtJNO4W%mNEiD=@{pP=ovD-YLicR1tV~(D=7;w1*)2PiXSzH+LO7GJeMUFt~ z%@>DHKSQcS*KXFAoFwKGrXJ6=cPhzKuc_JWusGkwW9j@P`ET0|WV^n^**F?n++5QX z*>e?!(P%xsO?2HEuVkSyd*(qMYyz8NE?T}fmZqF5#JwMmE%tU^x;I#52$r*8)uv`0 za?s7%`vK-j+CN#6NMC5Hf+lrmE^|DTHN6Pg>tzO zCM+bnsO00j2U?m(2{%(B{_^~7OXK-*GwSed=4quAJzm@*^gbVEL62@P_)P7*9-w{g z=nR{E&^j71Oy%e-wD8@Cy~EPDe@J3^`3FY_U!*{=QIvO7rWtu{y2Qw`Iw^9v4XeZ`cv zMtR}si$5=vhWf>&g96M?%*ONN+K{$0Q5dS~M$i1-dk7(?z0#5QaMvVMW%|tcszyQv zXdOpGe(%gVwIr4+`-Z~QNSAq%!fNkdgvD;&e%-r_lzZ;=y5kCM+@(I;VhPYv=3{OQh$8r-MM{f*W;COAwCPK$|>~gJ=Q{ws#R?6#`x}}sSV)% ziuk4B%^oUe=cG3B4oix`L~!D81-<0^T6D#os;7<4$e1zC%Es-ZqKk)?h{`sYkEM0 z5w68XHJBgh;?puo{zw`{=1_thOF0nueQ)G&8raSG8LnKYvG|`-Eyjlntb;g9PV1_bePW@|i}V=?Cs?b3Wy zEW0(}T&h4zEz=^~lnsZXjkV~h|<>u+H%NNXeoTnWBn8gdRw-2Md;zB z0XAW7BCsbM9~*`v>gI~PQp_nw6xliIZ`rJ^A>)c+6GwxQ*=-E3Gw}T(&}mC|9qzRs zz4_+zZ>PMy$JWoSo2_nWU7h#!5_Jn-;dH@Tc~8|Fa#vh*iH4Vg&-cRj?2)uf4YXBcl z5mOLz<(nxMCp%=Wmke6TrE}R#W0SPYCBxw4n#MianM~Hu!}Z+Vf`DjU9S_KnRsv^* z8R9G!QhdNSu0wY}&w2BGzD)(Y2g~q}|DZN2zjl^6MfGj1yRM`0KJ0yMtuwdRkUAZr zR%9TtHetVJCx^jpK}@OM^IbGEcj8C0tNd8S%F1_M&J)9AmBSyfuML#MbpnFD;cB98 z3JerpBBkhHa}w*mLE{S9Xk$YT&4Qo~3$VV9zJ^0AR=iYJ@xB2}X(6V>j9;v5Gbbt1 zj(7bBh6E#8dRUb$#RV(7`;#swBVo1Ms@}_B$`iBuu2)8c!8P3_?)*P`>k$wdQQT(a z0YkkrRim^QLr_}rK4!4frlpO()(%&-WIzcT z*D7-?;Q!M=Y=L zQj;JS5*TbqFs{a>$iCS)O{T+c#p?sHKknJplEj})r_o1$w}o%^Z!*yOr1+cZ&0d;S&2lkp%_yzeRAbjDP}9v#QW ztcLxsx=Bj#?jo&>G4}B(hl)H)Zl2YspC>BvJp0#At7s9cD}nv$>lQO?J&=7q zyGq}hG%9h=($RT>jDCD-M&sEt^=H&)m>sWv>2K{tmZ8ZTsFNX>(qz@bvGk+UAHzD^ z*_(Z1#2RfYTW>}B9fci#(Av_`3s*pr-RcYBUwv4)`H$>^_zp>z4C@$ByVEBW z5lz`Qz;w(U`q0r_9=BIw^N*G%?WpLQ>c(e1GNe_?@{Kz>@|#}K#ckGv`GR>s;uB(2^Z^QxY0(4g=KfKcDFfxxEW_a zg|Z!qxq4botGXRml#3Lojr)?oIk=1RhGZE{psT3p)- zA7!|zY1Gz*c5^Ho4tg#tJvveL2JylIWu2suyZuUOJAh|o{E1k7{5f-hRfyPx08O|q zdpjwonOF{&)6qL0utSue)D<~x3^>o`v{3oZrA4Kt^0iL?>VUEkz2~(!Ivt;Vc0hW* zEDxUO3-HxkUqgDEOZqr_sOYUww$`%tqOLnSgP&^KY=QNsu6drHYBeme?~P#hTGr3s zH`nBFj}<)18};2fSeScd_l)))A@=N>ulBQe^XZA=>V14%h_LoG;LU(7k z)}<2*B>jY!nTu+WjW;c^oiP~&Q`Su5Zn##=$h5)WS=G&AnMv+Mr?wffEsI;O_8p;| zMcrkX41K9cmkz0ZIR793rt`u*^V_}cbhjnT>uczPV=&aGMl-Du*L>mUd-I+mshWs| zRTey~z2P2r-u7O`U*5wZ!kCSxOpxU9v>fdTYd*))a=#{{Qx{xtKz+L<6=hfNTLHb_ z!3lr@KyG-IAOAcg(X!4@gpfBWgpK_sC(U5ruuX4{EiyyYCL*n^*wzlgE^$xC)Y8gH z^OOml37aSnrSPzxzEJ?1Xxo!h;8-$ULZ_5-*GR6U#>ppCW>zelg5o$ew~;55O831n z$w~$iAYDcI40Es^5(S#Sy&>9gx|1TN)a4LE53Gy$&o%S2`9L8uN6A!VF_EvHD6RYM zbx0s91snSbUH9x_FXU|FP!kI^TX~vPDt}RMeu#g1?l|beGuYhe5Yu;m`}}-`P3f)q zikmdRTIolB-UAs*5u2)Lw=jkHGGIq;=Y+6I^R{%*PCtwqV(0KNeGj$s617xAGGK&y ze9u=xa7V)UHQu}`Tb5gYqaJH6#_(v}yNvNt7H8F)T!2#65NGFO&&F~x6(I6$$)mDY zwAR&`zC2~Q`IG}unV*Iz_Aydv^J2GSL%6Qx6{ksDrx@R7_n9J4vJdX16Dh$2EU`lj zpnmrK(gu9y4Y<4<=}G))+&34SEvmkR7H;!?iH)%D&WBAL^lXQnv?O!hUmPad%X7Tv z)#jp@>a$Y7L~rMLWx{ipevQ8ZVUv2z`zPVgeH*?o^OGKHfkqwD!frucH4!pjzSgRi zCjrA3M?S8E6{EUq$7jnEr<3(M8NuGe*9%#J@V&CQo4AC7=U=Lv9E4t9u}w-<=Wm9X zS?Uh2^pIG#M&KgGIhJxZn~f^{(SR%hZG(!sUouZ)d#gb<0@;LV)2G#xfl z#|v;yJxeUI@T0&T;?^G*zD$kO1Qt5sr7j5>Nn%ukrTQpV*GX4aZ&U zR6IzgCeV-H5tZE($O4Z!fEg5p6~khp zQNz!8tZqjm7A!{zI|k!EeW2js{Rg3=tX&d_?|8R zd3A|kmr?d*WglpK1y3_Z{Wah|!cI;Y&}!7c$Hzy8WBxc9m=V9@v=V13UuQzN&Oz6K z?fS}FAJbO2l;YKH`h;RzjMuom)5T!W;gq1ykAd2|mG^#>8JZacnCn-aHzN)=zn2|& zZbH0%a=@o0vf*9znvo<{qdjxMD}QM zimJbmOi*yI9`t(V8<_&lrPbDNGQ;T-Y0`l{mLLf5xo})xgKP(Ya?=lVZjy_|c&~Y+ zge!C~du~4i%Z3Kp<}b%uk2dP{_Y`zyLG5cITHa3efFCQ;j=If_rXAX0ou5&kn05H3 z7S(KqjH7f~vL-kvC)_veB~%>brqn59e!#ZndzWpFhYl;?4GV_Na%3Vnwt1-os%r0_ zx~^8Ux=PRUuzBI(p}o&pq(0(7KaOt238mJaKlL%Rmg1D#Itg=ry-(-5nso|rKQQN6 zBRUCW!fEId_uRWZHm8aWlbFR5w;fm4*BH0=1YnZy=jRJa5u%pf4)Mw@PM6e)TlRpr znEVB1XHnu|Vec;C{L1r%)0)=&@aBpSMu6gEJxLViq94otiGS4l8OD~3u`0{#3+g+W z6r%Xs)JXkvaRij#?OATl!wzG=sJ`~-AV+$f3!e!nwtcQJvHf_dZGC2p*5_7~L2&)a z5f7s$udv$6)Wd?=IkC$2fNmE?Z$nFi=8vm+(tVDQ@%GZbm)uw?P6hmoPTra8>vHQ4 zjpz>4%7^X|+u7jpbU5qr^ zOaxhpGZMtXMG=t-3Zrq7@8xHplT;x74kuA@yAdSciRXFzm)4zQkeG>L;Ab6cL7;^U zgH$Ccz8_xN>`Il*>gu|J&W}Y(&s8=d!sA(ca6mm#>(+dx1yEi>qq z27U z8y)CV=*mC*eCe^>QrH)UVvkc&WP_Kan?@k>FYIi4I?<&Cd?pEmKl6-M)D@49hpR5O)`ZUA&8-bFsV*fpss1ETSbSy3J~=#vNC@%~ zx^_Y@TH@9ELsR56`|#W{fAQ*uNiLU`V4lAT{>&8Oxc5Nxw2-WB8oS%8wh_S zHXrik<=D0#U0kvZqwrIA2#v&O#2wQ=2uJBHfQG5#Y;Qjsz<6EoWRs*X1+6=sdh4*wX)9=u<8vARz5B5?WCZ5y9p0Bh z-;{gR6UZ&F)6$CT&54a{Sk}K0*14NnT;HYA$sj%1`I+TIWvL z-wp3(61@=0?m3^WXU8m28<;(LPXZOigtzLEAGmYxZ#;IrC}27fWai-(@b7-rU6ik{ zA(WAx%a5Y&I9zylhaU99sgN;QG4K*meQC&zYj!4&4(3#_;`!xQNPdu-^~&B{oi+sV zQw#I-9S(E!Mkt@0nQ?9EkfkB&P~OowGLd%!^?K2Knil|b;zQmP;HV^%*z8_^-F)CH zs^C^B_}oqw3*v0pI^@(taXzVd(IMz?+?AcQX708hDxY?N?G8Pg9s;TG5r!7I7#f{iKD>MND3sw^MpzLP4UNrS|puP@NuZ(Sv(_J@`N zm#j9l2E&A|&&!=AdVIi$K3!;{Io0P~kR5ylURsGXI4%A5lmWe2yHpc&j&6)QbV_w| zY^9ClbL-V^ws1!yyS6ZHB_8Xe6=EmpVhT$pEo@<<(;n=G)HeGFE^nAY0 zIy=@l&n1pUL!V!eu5cc@(RE$rohw>?4I?JQ15alJdg%(0CN#PFS4uVLgilul>e$#)SWLOg3U=?yT4eo;e}UU1ah=ETU-yXMKeH&PHbD(r;de& zeV@uZ*G)$J$2Xef$#Ka1MPp@J(|Z42LZK-8+(RRbrqUPp*~MvX?mIV+E^PoAVuFz(VA2*(Md$QNy;5_w{dGkvBNz+}^She~9te+n` zQQ*RFPb+?Dsr@$6Z1CxwO1C#;g#eFmGpvu{_a569H~n>`M2bmQPY)mlGk!}HZx zhbAZGfdCWx?a(&{7yG0TXJ|0Rx6aUz)W-9MTBT7%4w^t7UyFg^oP+LL*CrzS0=1In zK94H~u}CL~Ptnsrapi|xc5Ex>Gu{Y|iG zu79!BF3|O|eUY}dC?jN{H(BOxN$`?H4Cig1pkLnJOT-B3AS-kKno*!zY}a}Q(_!wbHy8=gKW zSB$NUpiZ+aDEscH&J-;f8=H|29rv-F)oSgjy{nzD<+TYG!mjRkjmU#_HTbypR7T06 z29DhoYhZHT_*ECzln@4ag6HmY_K$?g2`R3J%#)#}E)qYqY)Lh&5^UV;%|q}49({p? z*b?nlL_GDVd?|F_hv^P!>Lteb_T#U?x(%4%cX$Z3mTH^0#da8}o9IvF`?N}#$mdWr zZrMg2orR-{Y&E*xSlrA$!f@^=N57t#(`pC~@Js7+A+<@l!|L79^^?#u`hoCZe>iJ> zorq^9%jag~L)FrD!Wj$yy3^D1?IjQ`!NHWWz$U|&nbidH?_{#0f;!QUjij`Ft_)y3 zO;mEjW(FJFB~xNe?nIo+KHB{G2Ve$LaBktOoYrrkEhZ)*o`9lVUK_tXp;+5AoS}RN z-J{`ewz8&K7;nt{TCP5KINPb;*?2~@7DYu06`jSLifIcSI%+i*-QVPLA#-^zC74q3 z4Jt$4!(4B!ZH9phrtd=$ZbC*iT-Zbn>Ab}MEyw$ zF~u+>QK`O3!;Onmx7=|PG-bu9KMURPG)Cu96;RsrxQR}Wo!5qot7VSN2#|4oSKC0&)#LHm(F)PlEUxun`>q?r{_JiOTy(1&^YSl z6Fzx)81+#(_iN^=Slr~%$z8`FzPYtz2Pz00n$i=gIy#9I&Df83R`RzT0@5}VSswfS z8GGG_Zk*BI=m=BMS%GOP{7s?Th*A8Km420l4OFSA>JU+xwo<`Di#qg37r_>TD=1c0 zX@(}RJ(=$DRott{e7RGbEelE;*|M-s>*b;b_jh~eE2K@?gxYcW?*E0m6yOV@o$-0{ zA~WcsF)texF%~K{X*zk+iHP{D|7N5YWFj!5VX8Q3TzLL$@6nv$D-*|V(}N5UU9l$h z8i_k;^4J|B7Xb?7)=w~v0gAt$g0RtNxrMZ+=EaVY?m|RDG)Y*Uy<&v%L#-FGMp!0G zhOl$n-i#b~64bNuBNC-|v?qa=vwd_U{+Tx5WpG@#F#yQ01-L1XzASYROC8L>u_JT7 z4}4^H4&$bsF#9?>>X~WKLBAy~Se#%;-_WOPzB#cK`l8N(gOZU>6<&auWAo{s;-Xa7 zFmwM}I+)mzd&UAf4j0@Af75W~LL6qRuRpVzn+DpP&@z}@jL|Z&*u=wgWSbz%$(yj_ zqb52aCQ{c>k7o%Po9Pc{>W~->SJpWcxM}3&OIpDIn!W|16RbnqBO6TrNW*gvRE4QARXqxgfkigSd+_fksq~XO2V-&ORM^fp8O^mKJU3}2ob=NcoozRU z2DQ~r^JuQav?uZ$<$sd9dF`~-KJ1V0nBe1Htl*G9(DXak#&uGihL%Ur;+lhi$W*(2 z`|lA6%>{;7a`5;T-22Z+3n*ywd?bX9;X9Anw8-oOt-4gdt{!Yn_^`CcD13!f*iOIm z^(cyp->&1e_@zG!Tw-aj;~k?PaxAOfr@T_h2%4U_?@jCy6k<;sM?|YnQJkrx-V^OXg4a)^SVbQ2QBho5lVdLn_2$uf zdnhg_@?_KaqH-=Ma^qZKr9Yyv(Y#Jc)b(B5VCAHNC~1o=3ytYT`7OvkKE3JTDBUHV z9Y2dp=0IfgF?tL&U3Jj7TUD1D`6fe4eOS!Bd(+#acSEIn8HoE*ZdMq_3J9?ewAMFMi`tcTw9DMB z^RCM=lWN%#CYJ2$xG#lj-O*K%<2h98T&k{SIUzPG&gmAW_#*#Qo-S%;|G zSR$&8!oz*SE=91ea&m0XnWD21!ZxHmSMFw^dokwix(u*j$19r5y2%jn^FOuEE(lvn zOFF>p<1w*No~)n;V`sreiwso8r9HET0maIdlJXA4e9HVgnD*SD8Y=pXh}ufs8xt2~ zX`Cfk1Zfdd+QQ}8|Db;b*RW2tr_-$goz(Dc?CFXe*k7u@_^Dnje`?$T0*LiZ;TIw2 z-M7A(_6l8OA^vSSoham?2d` z7$vP*R5~Xa6eY;7zYnuw5UAMetrWezL(Y8^;^V!!srJ)4;IGH0Tt-}V*RBUXe2^2w z`>^=ob)n`~@zW}Ary0lFh3uN-N8h^IeBk@zH*UtRL@dej_X2}-l&sDhhF@lc6y6+^-#HC^0qigZGnz! z*^b5{GO*PdzcGtPO^uJM<~?7sH5OK=#I}5KmJYMCPL7+KeUwM=YR9khT?dTL&Qf># z8w%O+x^P58{$ljw@ZH3^t9(muj_x>>`+PqkOY>QFq1{tJHX2tQA2xf7$Go|`J28j< za)1;~J)O2Ew+*>z20wZF+AW@XDD=uxTj#{ljM&}VNY&IdB9@ruGEXooL9e6EnhLVu zOr{Vv2j_$$-*ZyL?oY1fD@p~k#g%rW%3KYZ*8Ully-BLfw+JSy4md7Y$e-+-2v?>a zB$ws?NEDEr`_cKib>TICP`vtOhD5XhfHyJZ9EDhhgOVFg20i$YC!yzurr-@J#DP#% z)#hTV?fGW2@0OUg?#YiVtt2}5v)xm3&fzEe>}Qprw0m-rCZ*C(vRAdlcrBKz=)WhY zX0UQpV2JY1oB}m3(Vk!1avvb?+Y2VpuFN=(?ebN<)m+5HUJEJ6Cv|Z-+nbJK$7@5U z)EFu%GywG@dS{zZ(k0Cxbxrl;crj`s+fCstq59(F7Ydi7&Ljlq5NutbGfh}S6+Lc{SI-UxNrK+Bgz!NH{2&P zfPgG)f6Iaiu=!MM*-%KVK*GMIGk6_qMLN+x-F6ohc5a?| zQrApq$Ad%#L%o=bkb**WIJ(Aqaf&A#;d>y^2zj`KoZM3jQWBE$r7tr!Yl4`{yL;y& z=`arSoF_>_O4v52xkz*0Q#+}to)v`W(s~N=rQ7fO)4$TKsHLvdxui#!P_cjqMWXu7 zl~eg>1`&8z5x=yr&Y3f!)tFUfP_v;u*k`3Taj_N*xc%dNQ^2Y8 zdPs?b$L%b*e<+h_PFsa_QUIJ^SunqmqPn5b4T|2rElTM z?O{BZo<^yMG_+xBzmzp;*NydtnwsO+eLN4`y@H)v(0d&5@B7EKuD!gCUMbQp_GuN- zWy|s0-E|BVCY_O0l=VH?4FTz&7TM%Pa1^9&$!QB%ON}HnD@%*vS{8We*_}@GpbJ=7 z5Ce|Pl;IW}sF9O#z`djC?8PE)ZJ*|(Dy4Gv_*_ECzXZLB4wq`VuQmg*f5&&@Dj_!1 zoc9!$3fZm6GlJ}XvUkiFAgbV6U76mTKe~R%$(a{?BodY0LSYJ5d+IC2s@I{2d#S|% zuT$np6Zxu)=X-&QD14Gbhz(kRtD*WVB=P2z5(pT*`HP#0J6H3Z7_CW-Mpsu+flGhkm*JZ=0Ek0%hm-w|f0rphu&x8QeUcK^ zKi2Wz6cym>xQ2&NA@@I!{qN^5fpnZJloEem3E+55{-XL$J4*Hb*K=CnHXziL{tul4 zq;7fu6zVCDtyO`)>muMe9`L8vwaNc@6#rJN_QgOFjt3BC|C1E-`}uv~PjN!i|2|DX zscix1Ap~8MvGQNfNq`6wouLZ(f0q4U+t>iie@nz=pZ33=0~x_3cuzw9aQOcHYt>r7 z{2NvxpnuX7{{5UE!1*B`Bvk%uaSs8M;(v?&zeWGwNxyWy|EFI55?or`Qyy_N5WR~(9iZqGW1;XD04B>%oJ%g^!4$sl)#i2QvP=NGE}`mE9!Z4w6mb~)$t_;NZklRL$uAt?%`r%ev_420b-6MdJzfJTWn` z#&N~!u*<^|?BN0Q1%i<%2(4w&ZhCj~jI3&xtp-{uny-8dCZpN^;>R5RQ`Xr^t&?zg zHCrL6OGoYM^yp|V7tG7NJCVnvok-2-d?o=m#m7ZfSxJfV&NON;XPA!1#>P2O znG9&5qV_ibzGgofC{1qQg&Drh&Ml>{uPBx$XCW$z1z9(kN%iXgnQ zQgg|?C)o`s!Ys#FXPbL1+!Z}hrBt_m9skwiS|s{*r;=70iNcE96-Nz?*!EP4<8>)w z=a-nU(Th^{CW7tJF;%X=U!?iTSlQVJNkZbtg`Az7SPNMdIhn}$*dXs~f2haTkcDvY zq-d8W7|<*ZDVH1!G!@(KXyCX3?J~iKKw~HNMYSWV`5#>r*^~KA8YYNx^Il}49^2Py z-5@UG077@IVgnntp}*FFz7DYXw{(hQ{;^|7WcHC`^GE#bDl07y%d2|$W$S@~j&R-h zhoiCVT5D2-WRo-#P84ig8jcDI3N&Su*$291?}90}R2S_qTo*TRXU~!bAO3v`nUv3- z$38Rwe<}XRhu?6LtD?NQ;1r!A^E0s<)~6Ml&}-ECmSE}_(`uI4$?Q5 zKAdZP>Jd2(yBY_uxx z-ng4jPiGcrn+a1m9+#^Fzpu_y!%*KUmqE8i{=C{0vIo~Ns*mmKaPYj16Uiv5@b`;< zlLRiI6GZ@@eJ0+K$Xie{I1YV*TTyAI7+hF zDa+fBH*-z1)WthL2Pe>I@Z$Y6qp4ZbdSp%bZdKBlSjKX&H>NkVv#2HWWbYsfhu?09 z`%nFvUspWFo2;F~R@VKak~OkN8AlBkVS%=X8UdOa%+HMjWR^M(8Lw;~oeT>8{Xo5a^fkUOjGJv$wWUjt z*Vh;r%O>G;m#_hcjp@pB;o2qbv=qt!`WAh=fiRyWGAU8gVgCO7mSKx1c4Y75*t!FyqvcM`DsDRB`M} z=W5ncw$t~J0}4Da%FHoo>#r&48(Fsvhwlp#zk*#$Aup6Flv1^P=lzY4Q}nCD`5PSJ z9+nTwe|L!Pt27buvPs<_!?M`~-YuVa$2NjzN%58KiTcA*fvnhscoR`Ji?_8-c~Jk% z2Nohtny1W#4Fx@{`x?smOa&DhSMqt1lio)ge{Tz=0^fZ%oVUwX4)mXfe;(c6u4s|N zZwlds8-Mv|P+iG1}LpxJagF&HZo3UFdLP|``BFpXyDl4GIiO4D-JP23r?5<9Vr3_LRN6gM zgtSLqj}y&ZHhF74QcL{uR>rr3TQxYN{&iOy-1zTu`~Cv}3CsI{^h9PvLN-Q?;OTeA zb^FIpTv3lczn*f%u`U}3_#Q_>EcH)FRv!0Cp#t2jo2D>6YYaitj6Aaux(QPHh{qT7 zb(Gh^e#F0)d1aEIq!Z<+N+c|7KJb_Q{eK{!O^+!1yjpY_z;_r7YsKY=yfl~}Q#V@F zaKUn8`$(8m;-ib0cK?3%e)$^T%bT{p4ig#{`lAMb*(@?g;N<-Lu@}`x`}f`aCGn`M zcf=>ZjrC-Esw(ahl)xQTYn;NPBL6XMAYk(5mNZSruvD}OhJzkQPe=3Nb1nz%(ed!B z|NVPpQcZ;VYS${6_uk?ZkS>?UmXNeA=A2qAMgPN%0X!jq{gPm!!CuL8LyeyvCx<9T zA%`q9(O7e?o{oa}Pjc_?wfOYt6LmUsU{P?J{3MK4?dUCzwQSORS*eWvZ?tMdohlDY zB`+&|{0fl$3$9vJYx2+1jIjzIN~9$lNIZ{E25|WqG@p*U5}WzvSAWQ}(^Y+@JvZx$ ze}pc8mp|NAerbiD!)z3gD;r-iT^OaGMR8y?b3|Zoj6=)mah|0hn|Mur{3L!TP$TgF zEP=@*Lt|C4Px&{<>UC{&Zo_^kc_MD%P*G4Y*?#}TORSC7glT#_`g`>8*OpN;`hF|b z4k)r>630oZmN6FQK{fg<>-w!lezj9tE3w&gUN(%<4O{|XZLCKEggOlBs~fNS2$_rKv4 zgkZk|ePJ4M!wmkj21h$DBqU^ddRm$F-Rrk7|6%=TyTs?HZ-EM>a~?W%|L62JMSTbs zEF2x&fJHKQJleMnXawlYcid51An=jasR6+UiaNka#H{vbu*Hl%fEjQB#kd+Z3t;}8 z@sZhXo3=Iz1tFKz&3}WdzsxUTJpWJ#yTW(N7w}>kU{2&%wlry^f3vKAE3m0--xaLc z>Fb!i>1k<&-F7n*caA;XRZBh^G{hk5UKGYbR21hUWC4R4tzH=Wf2ZGtn~))gUpqea z2C=L!pos(2O<3aN<|e12V&RRU#R2PqKr;zk=0nhV1G1BLzuEFDC2mSYeq?pA+MGbC z-RRdKFK!bAGm++_g5=uT+Oo2;Or+Y?CN`sX-&kp)4`e|7M+FIH9A+X# zkF(eb4T)98inr z|Lz;}xw67p`S|KpD|YXW_V>7yu^}np>w&73R!e=Ch9y-Rf)UXL#8#?p1?gqwT zl_tZr75TuEtex%)9=5YnB)Fx1d6Ac8@|3`2t;HN=20 zAOi#6<~;9vZAx&S64R>pf6gJP{MPmsB)=LK1qA1`R^7?=^Qw$GXln9 z!&0>ID$^z{wYBr^HuV(r_Zlu4_WgRP0Qx)jGOXTwCUybHv6HxdYya+V6|KKG7cuCV*8kr zGj|d%K-7sqAY!Q4bzg(lkQ{iKO-AT(^&Z~YHtmLg3H;hZQv^Lp=CBc(ht|!BKo+YD z%(vkXJ#V#V^Vr~;B%a~4yQgQ(n=pivOGcOmlS@xK&l;2^5=^_*Rb8G6jU&3aeCLgO zQhZJnq(@b-@so%@t$q`XsoHJhnQdeLZG&I^YiqXE$X@p|Fe;~00|i$4UDRxwk1+QW zM9T0{WfIRmRJJ!T@VVl@CfiB&s3(QzrzmU6L-G&euCwa~{H2CL4Jt1o1&OKZMM{I~4=N9=)|BYnB{DY|SR0Bcse=EoouXRtp;n(sgag=R?G5PVE zdUbGfkkMO^Hqw-J-59Tu-4uMx zI_f3g(B9KQA2{f94yfyZUzogVdGO!?Pj?NT@x7YZVV%_}3_JUbpUPSuwsEVEUt!mS><`i*+Yfg28b6Q}!!2f-_vNOihe(Y>Yy+L;Bsz$o(rI%oBqo)um z7Zibom6f~K=P-#<9S-jPR?}3CPn(PEf2`17cae!#?>;P}PgUwE8u#Nau%rk!0F^LU z3nbD(wKz2rz)`Xp(sr$yHVq$>{!ib-BLqB;#PG`pZIg5dl=blIW>2fCjamx`t;ftH zE3R#@t%&M8Y&7MR9!wnu^d6lsQb}?Kj%L@5F_F#p6SVxe74!_0+ zh^@lEhSZr&V7TT)Tvt(=BK`(wImq$DWQBmCR4p{^|Lp%N`n$W8GPDgh%=K1n@ICZp zx13$$oP|#Qv7VV0i5RF@@FF8`3hB-1xCL|Gx_~W;T^w!js4mJA3ky20GGL5cM0Bor(95l zrtLqRAJC#hX#{z25)`ko?hcjmKc^($xlBORDF}P0PyNrXJDKqbtnJx&iU0NM|33a- z$^2JmAEvYjae+OBYn-Wu+8^J^AsaIZsy~|8L3SMOxmHr}Tid zE}MI-Qo8U9k;im*Xy1p^%;;E-9?>tvUl8oIYd~Co%6x732SF(#6*}|%N}tNmVQG$) zXjS*nmwyU@8^1-qvFMXH5gR>IM)u+NO;FBk^KL-_Ibp3gn?UBLixRtL2}mrU_-l-O zFcHafyYQ7Jy=gsyFE=h^S^(&=Mlh=>|L+`RjRQzQW|w4j)Gw}-JYJ+91r1)~)wkVO z92Bq7QV7k}VJ5d&SzmOC*VeNBnLIv`q;AB$PWE#3NwNTGf3VfT#v&$1<>yIgCORif zCw3@_;vzQT^9E0#)8f;hYH*zVZKjY4pS043IXz@`JyzSbI=|8U0rEnk7I6$L*sQ-+ znGQAWPDv3RvG9$s+%ITWIu+{Slj)akf@v@QR>k2hB4B!3Zp`%Cngp_tL;nv$9rn`| zvC-H}rQ9qIl`TzZY1M_5*uQhG;=XdtEQjR#ecz9^izc^0jA9osyF4WMFmVfV)=QA- z;&f@&vH^j$?{#=1E;I*#N|397?)f%mQErPyW<+CCj{VaNjQppVA6&U8fX_76mpm@9 z`CWh8CU0OdVBjuOSA|k}cnx>@VNl9*;qA}9MU{&S;h_-0V10{@moU z3B;P4B0I|6C9=WR8@!<;R$`mK-9otaFF+@eIX8fI^|o&!f5=9%_U5)( z&wP`GAVUobl`cqNUkMQCTmZ6pW$=pjq5X^b!Tgmw7ykb$Meq-vq$X`U@*S(Can$zzTdLiKAn9Ookkx@d3}>o_bPCZc@}#Y;aT}O7t>D?K&)&*IuDdki7dFwbGcjO6 zw!o{O*cr4}S7i{(Ioe+fRUtRtVYTl!U%kC;FbuK*R~tHB9plhobKVpaXg}zEx@B-& zohW=JFxT)}#h9ng=Pe-16F)ziHph;sNPgyByzkwuqBvL3;+Ht3}Z#dOWkzk0MTj zmp`SF{J|SU^b(S|#{s&s1BxUuaTCJCi>{#k8s=c$MHjSIl>{-yIho=>L{qyVkWqypQ)f+tIlsMw>kNpds(Le8`&w1FK+| zLojB*&l!?Vq<-BE?lWw7W)CIFBzfu_*DgAGVKw(%0Hb)gdEAHajqW@yj>(yau8+R^ zlGML-_3UW#GK^Bwghp%_IcLWjp04vCQ{uq1hi|SU4E3Vy!$@bW9anY8M-Zw(^8|iM#)XK7$8*e{)MqpNUOsC$Uui z*9GKuK|Jz4q4gQNKVa@H-Exmi#$=rb?f0rc!h3Qel=ahYcQKxCI%P5q1qCKIF27>s zdWWCTv9738Z*uQdlNKc0bn=OaOPEr}gGc%6BCI)aUcN^%@yb7e&-Yg3hvQ4X&?bz(f=1is znjaTVSGFKJSrK=gFO#^{Mg0_hbQvdR6TwWI#m1xj$L;y(0jud2v{cq$Ml{GSjglQ| zlb}M&fY5JwU&cN&+Hg2rDp?NP8iBNHd2M!2Hyiz^;(6B)eL7{cP^MZp6?o&KX90l1 zcznOr(0oG~y@gvsXU2>S^tgiw%`#FF9}e4m7{RP zWLu2F^<(_0#SUs+{))G;7=h`6`dj($A85!oQ(@R`wsP8FksOD#I#X zYF6lFW`Niy;_<~1ac5p%FSrr;#&gT;*BDRXU(*?@7%XIZvU3DE+gp|~TZF_CXx5oR zpm-1jyX2_?TYvfXa76^Kc6I?hAt=aDe{!cSP%B)@lUQ_U#gwyO}0#lk}P+`gb(0AUiUt5|To@oXJWzyGR>CLip!P~>G9MdDr zo3l9s*4C~yElU3Tlf0Z4#-qsq2>Oe2f;+2-6(@gjY0 zK0s!Q?sw9b%j83CmI$ZE=NfGd6crUui2dVMth^r#utqYIvz;aI-1=KY^8QzVrUm_D zgZzp+*_|1~H*nnZv$ZGD^h1w7{kRXR1-X>UluBiWYh2!{dm1`H);3`o_z#r4aoMpCKE!osI? zUua+2bMxc&vh87T%CNyS*h5B6TU6{!O>3fVzg^9MN9Y!}1ZZ8=MCYlg5h7vlZ$n82 z&?I>H)m-s(qaTQ|KbHsAt@d@l<-8v9H}yM{bz~N>1S`x>!9s57`rW>3{rZ-Gz*hZU zvOs&SX#I&*&gKg)^;|Y-Oi`#}oT;?Yt)NcpB^#`6Cdd|>xU>UP#>T# z8y=Q}sFPUl>jsYMW-iWQqdgw`>g~Y7)VGEomIqFrGEm!d{Vhp6f^EiYcz$Ox1<@7) z3x{V1MS)sd^HVe~O+mkRWy2}2SZ@*f!(~rE@au(yg<91{$Xva=vy6sKf%eTBQllJk zo5}sjgG;JK%5?EfJ56y|I}D-*V2sQ00`ynbW8%E`yrc=SB%4rOrmWPd`uqaE`Y>;e zkv#p37hAGLSN`UdTi)T}dq}jH=tKL6ehCXR#%I8%*6DHLZNHNCmo%jqHX4$J?mmw{ zm0Ex44;5Kwx-arJaPYUc)*b1ZVv&01%z}CHBauC?lM+N@PpwxS4vSuRmv=x**r@VZ z>2F=bPoo5O`U#1SOe3WzCM4{)k%_XDbfXEf|C5g1oMlU$!z0?ze8f(0&rg040uA=+ z?jO}ds}q;}SoWoay@T|--JOvI*8=@L72Px`Li5eIp8d&HBAkiYjxTRb@fSTK^C^qy z#Z|0&XO(JStr5{VkbzQOn3E>N5D%9NjvL5+nQ50A*2^sKGc-)Z=!D2@q#q1!(UYS&4r4Be3n<>f_9 zvq5Egm2C%c*2@brtyf)%#y_>iH3;4T37FM|YsCM$I$JzA)J>^W=I(t$nvpoXY;c_= za!Hx%&z6c{C33*`>$b?F5~QCnGV$9U{UY1`>xeQX# zB(?pDhi_FFzhJ{E@alIUwzgFl|;Na%t!uj@Ih_=!7x5 zo4H?r`(6vNk-+}4_&{&g8ovOY+WuRr?^bV3lT%q{YiA#>78w6&g{Z|4u!hdK2dyCD zl6~gn#l2VU90T{oI*R2RJ*QDjB65v>u97#;Iy=S>{C*vrBZ799R|2NAZBq?Ky#3=y@+M&9g~dbW4Gz{y&(p_w?8BGz}A%f?_%+Un;M|#;e3^ z;Xk!)9SagVC5r%SF#dh>=ay|kFo|gVllm)79oN~;K96LFJkFxJV1mcbQ<#iP(^nkK zIy1-X`P>U29zE|Y9(U8qd^b4SV7<|75)#~m%F$;2d&-dw#J|a>8?HQ{anQIH+Qr`W zQs7AKqv1o?_Hut5oG@Nf~n?C8jZpz`Nf-9em|AHw_SE zXU@wt`Kwnx;hZn+M~Kn8Yh_|~2P_WC?=&6D4^+ig5IwX0&|G#G+{ZWY=FfhlQBeb0 z;T5Msu@fXDB=}dE2yZvb&DWnae{X4F5RzQ-mUEwIHRuj9o0$$N6c)&gIPx$lKa3tM7+qq_D~Yty|~?-74P30a8V789BluxKi*dX;n`%=%1o4KFdW zyJ}95=HStdIi9H3U-Z~7HT1so#Ia8q;C3LoG4WKF9xx;-*%}VnLvegq3-M4tc-3z? zOP`Y-TrKwTGR*Hg)UJy zX8qgXMobe;IqZ0v`Ib`?Wb@v2A1GCtv~4c#TDxd z<`_|1gH3^*sYJ(RcfUDLU&Wy|5tkA7Pz#4pkb&X7oz~@~iV)%!>=5b-IO7txoQ9h_TUSBLxi28d;?F z?RrSbjW4+wx#{#;M^Nh1($Xr)Ca0%M4T$fY%wgtEb~!w8VP#K`6W_D%CJ(;~1QIk) z9GtlI5DB7kK6L5RVy=iXK^wgcTR)h2)flb!M=?J$Xj_9W{qPuT6AwZT1?*Kly2}Lr zDI3Ho?!sh|XCqSE*hsmis;#5>@PvXH8K#vEmE0jj&p}@Mckxn2GsX|6J}7>?O&t-l zOl@R<=xue_DDdxN7+@Cj-(G8;dKNAgTDK$JFR1V*Aj>-@1G4?&8GffJFwshUMj=)Z z2)0-eL634v@R|}BN8DNEH`AI5BC^K`%Y6J-U(1HLb*ImP_-9>I^^UPx8QQE;%~TwCB|qfvY6 z8hJs`L(oISfR3$xFr=>=^9W6RbYY{u#lydQc8SKpU_ss$)0fhdlYv#Sn2n3^Z_I$C zup0_FfUZnLeFi^Ae;+tlnPyI`{Q#%fnE93d9}F|?fr@)WNgec_RCNC-x@qw`OLgtUj7ZCt&YDTAIw!v@4;h~SEpPqY`6z`6J`d=VF^zsm@)}b z`?DZx=Rl_>$*NDgW~WcEAy;*}g$WW8F~(i@w4B9o-x*@LmkFPkxZgPRc4d0za9=W+qww9vm|g2(7JXD9J7rpUpvB!AAOLDrmG< zmQ93g{`Bu@sfc(`zJB5YwD>LMhtCBI=aUF5$?ARY)a_e4phJc&*Gfv_m;5Z>t<*!V zEUYlPU|E$flQc+li^~b4rx?)-(yrUFXIl-O`h;?dXy9&?kq3GAn1@K?t^5H72Jyi$2maEhG57zOB<)$4XmCY zw))cx=BbLPIS|Uv0I_BGEPOq4#3VBmSai2e}HRqu3 zntUXea-xs*I^C8bz6@p<jBs{v&>bFHfM3Av;@W*skO}B}h zX(Zupb-wbAmA}ts*%q)n?GAGtWEi|e`bFZAh9tcdiFiIbBI`$}NXBVW`nyq4ZUa}F zA|56kg|Yi+A&ZKDiDXU;2Vw`*UNSIgwxluZv-w5Y&Ti%8XfG}{wjgo&JX9ZkNWepZ z%KOASjw1kS9&y;3j)-G-I z{7lBQ9fRSI=@|Oi=FUES%6jq8VkP4oPGHZWIeXGY$E6TaD$?H<@WGEoWZ`cp>%B{ zIeM=BxV$u{qWppQ7>4{-mdAGUYK6K={MDNC%+&$b*%5j?WktsA;~WWe7kZ(Z}ru3}> zeh_1t?mpJYl?@%QG&wk>Gt2{78w6JBbn(Cz5n%3Ov3E_pQEvE2VL zST`2J0MmIm&*iixh>r_j;pevu+5Af7u4tpA_Purzd8z-KdP{83!gJ1j&^t{=s}Laj z&t!A}YD*Dq1AdcpCFwc?P4g>X#OJ+=8rJiX``63I1s{(b3?pSJ>r<4;AFm6w?~k_l zZuBcf6HR-na7D-~1E`6AloL?52w)YnLQZiJeZ-5GBA5v`e;un}B(>yaa>HS^JzW`2 zm^d<0U0Dm!{A&W=YE%bEahARa1H~9B*WG8Eis52dWaW3zNE-|E_@Qbci|+4ef+i+w|G!euKmUF#JN9`O7 zBqfF)e(oB*T_Hs=j3|?u6GO!Vqk6(r>3`gJ32$7=Cc+}@xXjX?vaKQfc-07IzHw-Q z^#3fRDLH-o!(5LXvD6t!h|)CI(RrF!OO17{V*^x5I9C?cvbkRnMPSWd{4p^2+bOga zU8jj`8>)kX0&h5}?0kN6bw~;=9Ze(=^Nf;!tX?mIVZo2!Afnq5e;Z%oow|Id3_)yw z0rTVLmF#<++s$I|&j^BIL<)EQLRr7GyPEKxbva_chtaB@1ULBcp3O>s`oTlku6f%h z>j5h8Zi@{iMAohItN3b1ET10!PVdWU33RxMC&UjrzWM-l`}oU>;*0b3nVB&U<~VoD z053!qF-<-}NOcSE?-39IJu||KjL6m;#|j?D%>}NqdqeM$;ChF4Ap*Xhn&I>YC0I=@ zlo^{CwV{5_1Sfqr?BrJ;fMknJ!Wm6LM9$0g6UsG=z&?3x1tbSypqva~?MvrOswg7` zue=t)JMdLqzRydredWHcnT5H*6>;ZqVZFrwRB zj`YH3q2f?kpYIW=x5}OBOig9h@?$t8eb(N7D=#mSJ^H34DO?j%;xq1I97z;&14LO* z#rs{Ogwh}0!@$5$f$*PhaLu@?-kN-ypPyCCDfvxoq43@nU~VcZo#m?42ivnC<+s5H zo6K@yZ3dA*J-i(Tg}{Ey%|$PaZW|umqjesy9C=P-inbV|=>0nG*eXil))Pw~B;BIVTH^== zvvR_3nbj=sO*!GIrPfkmx}D&wmm~O5nLLS_KB&rZRCzw^3%h?-m=y~7{?}S*(kJVl zPOK|(>iS=K@!}N~Q9Rj@-#dj#vK8;4hRp`2iR@AxM+5F|vn>W2RYU0_xA^(hTd6pt z16H&BQO71+dUQ((95Pei=SRqKb1h4WQliXJc5tImNvzMoFZwm$5v22c*?#WnerfpW zUhZh7xN8PfeaQ9fR~l@MIWh=q%nFVom~{``Fr&!CNF%4pqNKxreaOA-l>_W(LTc%q z4XZQLu4<0sslA)YJb0R~;{bS^CMlvLCS`yF$A^1*GA&B!qb6PamNb%scj53z_yk|e zroBpVESGkNn*oP9Q=w!Ogrf;x7Dj0E<0Owo)CnVuI4@BRs8&96ox2lCc~ev+QeAieaDG%Mhs!@_1t8NHF7Jc!HZWT5$brR3+2 zlFt6NM{&oE&jU`367O4z`1Y7Q#k_0X`9vvZ_KhFXR$wK~LR(1{W1sCi4lmbRx)bSg zZefCn=zP*|`2!S1th;;1k)7DyT=*G|PtP^8?KeQ;>1Oo;z+pJ_A>1%kK@ zO)kkDAdIXG>|{8l*NZ+ZK0wX-&l~J>Xbm##v4x-P^57ZzZ>*1%f|N%&&weXkwz&5} zz1(1iP0Vrh=74U#wVBnzQ~}9TnQPj2D^o3(*O8F<2z)}*JM$enHMoPVX?pQo&tB%K zDh@5l*(!@xOJIT31)D$Td^q1;3wD5m{EHn0X!=VWr<)5=nfJujjQDY;*@wLetfdQg zPpyUXLAtkFUECGzI$2krsZd0eQag%O3V_OUV4J(``I1_(?)I)dTOZ_5Ii*&Q=`p_e zFgboGqGJFngM@{L;}*-SstiSH!&bNEVOAg_Qi8}R!Ps+lN4|i7;+YsD&L&BwgfLCe zB4{Pu9+jzlIrG2^IPp@@Q0823IsR$$pnppXv^hNRKJC5?1>ASnp5_t$@td%^u*tLS`H#z#Co54Rc9)$n`JHdCE4nrPAnEC}!_nd< zbf^1l(=1Bx=?_MMm;#R=k#Y^Rf~sxXq8HN{d}D>!22$6zc>nU zf2K_sCDQi%8?6`Z<(q%2`v8Dn<3EEMi2TfwQ}Y~e^} zz^7zTR{3>aQd~*F!nb3;Sjh2FeeYwrN{`eI6B|j5eP1 zOJzG9o5Mgc819Z1P8Z`}Ua;%;R(3~)dYr48SBldtg+WA_mai|7H{4YP)Q^)5J9$zh_-PxoZ};nr0X2x&2GO|g9C zo~@Naj;m$YXYY{ag~_iNvlst1iL4LRto_Ns{m9_`IS?lw1C*lp-xhk+s=m;eIe(P9 zco>?HFC`9>fzB^{IHpR3g`xIA4`Ji_+)jSOA20zVxKqzBC`Rh7U$45g7~Hev9QGe5 zDw*91bvqDO}f1Oedue@;=X$BT+Qz1u$Mgam+A-KqYi`R%*h{&<)V;_>i4Xi z?6n(Z1l~XAq^;z5Q<~+a*1t4yPDa+NFKpHgjqhR`?%`Z8^hIwVm9${;BPhvxj#0;8 z=MjjX$x@VmhuyqXX);c5D+l7DWm7y*GlzJZ3P!lM;)IfHAFSNS*fJwP-@_o@>OKDV|Olv6jn z3AjZ~7IJ4FL6x-HJevut-iE$K?yddUI+Jug^~5EDS>EU7)L4H?E;Nx1;_v7Gy%jYH zo2?U^UBw+WG0*)@eL4EpdLXl4d-%PMUc}17EAXS$+@ZG%NzYZUM*xLk*hK^qVo+qN zXLiYRK;PJ~f#GV9wS9)fK(eO5if6Zym>xe(`(iAA0XF!HoXmLzcomy{*!hQpV7dg2(JyDTldoUaNxJi7}$G_}=C z7k-@W6Ca(UUNJDUi9Kk9ful;k>MC>adxwQ}q`2j1PeTYCeWj4YOqV;ytL+m)bj0h1 zljnS$ypstqW13O}^#T$?F#_k#L!GD~+_JUERG%<1k>=xs|H9$}WU@Fs@v9)2Xq-T1 zt`2??39ib#d319WeKP?(`aNdA+eux~W{1+*GPL-4(z70+%d)4fAMAKj;rv2ed$}S) zGP-6WcWX(epEFZ}#^{N`CGqWgksgo_!&C><+nuYor%qtAxlFT8*H!a?+k1L!S!` zTp~AAel(V=Ef?R<*QJRosn3lA;)Z=qd@&UzFnv)@W5M0JUEak}Z;AGer&;7jbgntU z+s%Ib7%d%nhxvjN)S%7$=wSWIXD6@()Gkg%5^vnU{Kb>YojPXQK)O}c_DhYpexTHG zcv8dMsY)SkZ#@WV7b)vhUQ`A%=c@}O7qIL&rOFWZ(|{Bs&~$imr@xmDvYa>@{3C%l z`iyO8;aV{HIb$06H>)2=fZm?R9EN7{6s?BYeS+(s)r6w}@)~0$o#G(7W+Y-I0UtRTmao zG_QCDxS&$YS3sm%(f;H-cLgd&OqY;E0VvhIY;?#M%i4~({aSY&nu(E@?gQ&^P0+jg z@p7o<`*f$isrL>FT`0zm9b(@{qlXoyAEEm-f*K!!9iKiA*1>)ka~59D2P5vf@yzII zS1`ji)9DAMTq!2tksTsdR|e?6~Lt7fLH?Df9qRL`OKV!DWnkbn$eTY^`>jdK-0u5TbAjlGcVnP!m# zorCt0o{5g)m!m=YPMnn>n)Yn`YE-%0ZLA=oA~<7LeJK^Oja%Y8GfrZMv~ElCFTk%o z^?vMB1SPNz#X050PFh-8R*|;yxFWS%YX~eh-hhQ2=((LAEW=Kgg{Hi)>!q25n5qop z57xYRhPU!IAh5Y9^>bR)0|ulk$LK3!Pm~sB6@yVYS@+PwmA0VOoelt4@vR>dx+F6_ z{stjpqSd+;ehi+9Vr31bplmNGty9*hJ=ADksG^=5msGT34M!Q_PQ@cWbx)kH%MI|a3l2mM z9Wi39DfD>M?2`J_+j+1e}|JW z-2y=Pw$8bLS%Jb&p5*5DeKtA$s%GD@eB1vmD-q;n{)Nrr_rohR3Vr|kT>#z*ZHIHg zJg}Tf=V3@ou9(~juDeHWx~cN6$Z_zOq5c5}me>;Hnk??@{+0rFvGqv!esYAbhtoCf-{XhZ@SKLgz4VNkoUM=<@rO zFQZKQ!TlwK^sLTlv_QsK!dnV$E}W8%n-+FB5b7y&`iP+KNelyL@K+)#jb7-w^T?#Z z{f;?#MG~j#O+m#L?@`-DrwEi9*zQMJ$Fig$A^37h;FHRGLWeWnNxp(m60?NSaV6Sw z69NK+XW=VV7H>lkTIZdc?s@cnG}K09Pjl_K=8cxARE*@dsYcrO!nw8#gW{f&zS^k_ zXCqlyV}7sR7Q~G6XbbLL$$8bV09yCC&f=9r*IZc^OK%9eJ`NprmR(`p&GJ4$Ov&Q71_{#0BoupV zJn%Kc!lf@&06Qu!5>@`rgrCEa!1bw9!aRf4Q%s_GFyf@@7dR^jPYut-@hyOP_@CRl zy$)?q6mg=yQ7QtFh#H%xcu4y5r)ACuR{MuRL~i4CVn>*d(!C3aZbS-wK1ulPP4ZXB zR8A+Skc2(at-f&~nZ1J#E8;>n+M086r9%*B2Nf-K=MH3-KtflqyGxL_ziql;fQ9cj zb#F**qmFX6ie3)t`U?{|6ZQr%ior|di89HO6*RKvbyETqx4l}o8m23M8^-NByxpm_ z?StPlJ`!_;72N07A5->ScCBIiA`!O4I`7fe|C0hfhCh&5OlCgclCgvuRTqMu%2vqx z#)bh#DMfofc;qqTo3B|t{e}W_Dc>%SQls1NJxsGVKQ8!-%StaVQ{&$eixGL_ljC(dt4}({ zC`n+3CRwx;;g0=u$6B#W%D$U|kjBD7D+H_|zpA!oZdz2ts7RO&{$!*^NKJ!6V#ed; z6apF%{AB+1JoKDy)3#}dTC^K{@5J#=|Cx5uYKl zn9?Y|Vom~S?tRWl6bu&Q%VO0_OFsnZrfZ*h$XsjS>C#PivP0L$Q0k<0o@W);9so@0 z&zbw*9}{3zi(YvriNXVKyt}3D7Y080`dgN8u`)M|zl`;xNvC1VnyR1k%djnCr;O#} zlAN=ZNQ+nNlQypWOp|;2Uw!=S#$Vtsp(kMv-=SBdv)?+h7R*dx>}+i<04iYot5brY z2#84Pw|5;>uMVhE4|*>TWJV=!y5SbyI@meG_|moQ%DO?}U1NBUQ~%@5r;LZQ{<$V* z#xjxUmW`^i?hmKGUvi%01y*PKIFhrMRXt&$0$+hisx5h8W{*qdaOHt(&foR@J=X#aANIrzc5CCJ7Gm$`G}M_H(GcZ!%;Jxc;6}Op>bmbi+W0&X0Nq`-TRe&&4LMKKus?1}Y?@-YH0GgafM-wVZR%*K`v==s>*GGf!p{dGm}$n;?4xMd(125PMme zIgn`sl*5F5`0+wcDYe_7XtX#n>uLRZHfQ$Ce&(CBE82Pr7B`Cohb^^=>hlE;`i+6W z%#d6>PGI9px(Rmxyi6zH+&|nS0f~2K zxs{&%`uWX&F0eF5WNNQ$K4FC&-Z$ldjWOfQyajAjXW}@cRfHmGFo^{u05NSYbnN#R z=XOZDg93Q=DvKZrhg1EJLJqiPZ3T1-)82M$pj#`W0CWp45;c`E8OO<21u~p04?A-f zfv_12%bo76F}`nEs8|I*c)rjX$wJF8lsC_P+-L>VUwYWwUfi3LUMzCg%Ah|}4OSeq zs3jO|&8~TESak(PX^88IoyeZ}yvXkGJAfMDvQGGvuonyWZ_K{# zoOSDlSt`&FcA^>~M0Tjy^(^)=}F){pfXOP^n zSt3F9TSr_yQHSrRO7-Z(K6O>rEF0Dcb}Hwdg^u;~bjS696j6it3?6v?2#|5#l9BnS z4SJoyo?&kXFsHy#x&kZUDBbx9sCp}aMLl5ERUoBs*a53GCT(686Ynr>n_b-JO zz3LoBH$d?0G8U2X7RVl*PGUZYJdO1DUCNp|R~H4%3e!^FyXdx|Xfu|X( zaOBO+JR^6W&w4GpscG;QmWg?GasQRiTg zE(<}sIdGh&Y5ALJa5H-vnk3TNVpfCSGN5&_^Ly<}B<%2+M)mbKrscs~a%V?c{8&WZ zJgZyN^_(?-<-l)Xeyh{oRv~o79reXFw)gKcSat%qOqnM(2KI^Dz~Cz(KBp^FlS5hj!kwI5Vl1ybjq--i5t1(ea~CSJ*9C9V;ot>_})? z*()BxGJdILyJ!&eXl9i?gn3@R9v9G2zk)C*CZ&V58-?wpPZ~WZ9(~^yI~O$ZI`Y+- z$nwmzp%7a}`reoFRgx3eJ6gr9Hqk`RP_6X#-Cow7o*q-~i93BGX7tVHsn-9L&Vp=xf|#N^%{jCqb77unv_uQi+u1PI?J`=I7mLy{YJKnXPiUMN;n z+(w1;yVtkaCe4iWu3l;gBxBB??B{30^v3h&N{60SS0>r@R+NE4J--}-sJC5nthV-m z-koyi+XD9h@-gq#i_F#M=bCt~g6ALK$nTQee;|?Q1r&NPnVT49EmJ;0iR=_YJ#M^v zNpEYqE+NFlf4b*5j8+$FFEa4!ziyhZ1CUBj4YHO`cG_Q^wT2gdLBm{s|Ac6LWLVXC z?yPu??i4)+VIes{Jt<^m*h zRC~_Idb3cjr>~t;UuYlTP5~NFXie~Af!#ocSSWTsDJQ<(kDvj7B^%Fcqe?N0_M!sWBTiDsp7m@3{ zk>jxlz5%3#f3`0=^^QrwDhmdK0WaGFW%xeI_~W?kME``pP6y9g05#*S^IbXGXG;_$ zbU}JtVOBQE-LH<|*SNH6*x-n5{|sTrh9)V)`$XlrtmF^Kid7LUjkZ+Y&u%4DZxB{{RtBNY-j7qYUlZ@SKm24;CggX`GNi#}vfz4`aw6LsPqNm( zbhqW5yr!n6M1_FCW1w=3OP+C!!<)Z#>=itQMXya3CU80#()3$m+DPO3M)=s*Z@iJ8 zd2SggPXZ-5o;WNfTK;7ibkto(N5}j|{!UL{j&b1gT;Wm@0`(P3DN+6(r=yz0lUAu-BX zZqlzhfIZ9rN*0}kUC?TgFAeC&=0loFI%L^)tlmof?pRL?aM|j7GwuR7SS=ZhzN;(v zfyZc(Dp35ODLtE0s9C?bkW-<(6CcSXE$a>!l=Z9c?9MctZQ00H(XhDPbN1#%zQ0zh z3RhHS?mqC1a4aO|z|lTGpq9b3PH}Ik`~jWW|Jt6&IbIrjJT~V`mguOZ3Mu_OY2$es za?nzw5Yv>Y(Un~uP7kNztQgL)|Hs!`M#a@^Yq&sgm*DR14#6$K-CcrPaBCpAC%9{H zcXtg=@Zj$5epkM8_TJg&j(dO6gVCeASFNg=v*vu>cP)r_;>q#ZueKpDHIanvYs`BM z`{kIwkEVD$nbcX+-k`oF+((eAn?Jgfqr;gozAkNl2aPyM*FE=by+_w`rxb4SxUUVZ3Giu0)rq3Hc zoPsGh*VXlmW=UNiE_Zfkw6wG|bRGNeFSfSIes20Kz1lCe91B}rp%pqN3Uk3gL7VQ% z4i6!C_$1xnU-Yw57uL-@Tgzj^LUQmsv*2*Z6z(sEK!fgp4!r%^t?LiB^DlqNYd`p>W`Xdo(FDusgu`&0L$1{ zuymsKRo8|e>U!cN;;f^o%G5rZd#6+3gO~OOOKDfnF@?GIYO~Ycw1SW=(xbpdAI9tz zZ;stWCBgC{PW1h?Z-C?(0zWqzm=1TpS{P@@ov-Uo1m?zi^Goo{>9&W`OD?r+a<=-~ zAhGW3B!gL=Pqxm3Rf*oga1%#Ifjt%RC0853vCVR zd=U_cvfK-@U`&@H^6106E`6vN7kYaR%r#Iml+5Zb#&bWuGxK=Hj!vE&r*m`UUB|uYW_vKKBf^bhw|&oahLprl&0LXD=u$H1OC-m@bfG_X3PJ zfqq-3?|C;2#BlqaG5`FeY}TN1oR z$nTmQ4j@MNC8ZUI^UOaN)W{`5O!wsQd1T4s_z#C^8&@EvYo5-^=@6dU3~&V>mPzw; z=oQ>lqPh-|%drgE2gG^<5+?VNgCQG(2mTyN{>dS-VGxp`*`E+KrH}4%JXqn>Q95qy zn(GEWF064RxW|rl0wiL|UTpz=%-bd1p_Rc>t(o*&PVXiBrcijg9uw-Eh8oSb!l$sk ztnnPN5DrdlEv=N|+ajgBI_av^(AH?xEUm;)UHs)itnn%@bjI}@B zOxV83&`K}8##7@at^Wq+1I_oP8_1i-dx8+ggv@GxoqeLth*$jSMK8^)^*Yn7=<|8# zYT^1J?h#RX-+|4I+#fIw{ezx8-JTSTKRi4n8Gt-~2|%?>1*xe0>oUQ>;rejF*rAhs z8OLF5nEAh)#!A_*G~I9RD3lAeb!G%vO;&zQ0dk9#Xa4c=aexXE2kKE9#qXBxIOl?o z@aY6{r0(qO%*%P&5TK;#=!Z+`OjLzW+O?5?1KiKtIt-D!A#jgbk&XVNCIKu$faq`Q z)|OXsckpgWy7#8Tu&98wsmRp8OCG45yxk89aoH_fz)xkbK_Orv;<8bMu~8T9yrTn2>M_0_+Qz`zhk?# zb^h2~x8!|c!u9a}5<%4da=R3P#mIKz0`H0WNC#%;JIe{Vnl#j=bs|Jg$wQ;KhML~E zy-}V(i5BB#qyAcIu8(ov__8fOp;+gf_&J1&bL!jr2ve(UDGa|RYdBCrVtVfm)Qvfx zGU)z*%h5z96?LN2p<5808iaATFmSA62w&N$xP}4 zCr1(>t6k6bgChfkSR%^dhr-}D>OQXzd-cIlydlsp`kn{*htKJKv^NSuIPm$uU)`yd zU_+Xu*Yj7>-mU_6X!XzB2IbPYon_NqraJ?F(_952!O{hnmMR z=J*JJVgo~{Uh`V!8D8T=$};LHZR3~6qe=}5-?R3+)K$&3=UwibcF(7i zMgX-A@_pVS#w1#jQO`g?KseF)2PVp(0>b#RtC)1*Y%+!mvp;6YU8k$V(~j6+%+Hgh z@zm1NlDR6@iA%Nk;3q4bLgRIc@bZ$%*4-0xR}GD4?_bMTA$|C?l#XP`2eST7!O^_6 z4nKnLAAR6tb+VtGc1LkJEGC^M1PZe(Jcn{uZ-Bih>i2BQ&7Llh$>czw2t8MMdiM$T z1O3S$fS>9g-x^xIIhv<`R8xY7TGGlk)@~m?YvzgoWJ8Y^F}};68|K(#Q`q|JF6hA2 zz0UriT%6W(`x~MnBHc}nTQfp320!p*lno3z0X}wSMpdpUJNG(YTTjoHSw#jD9c)Pi zxN1KH;7F=rb|z7x8ij^?BNIojka# za*3C84H;c#_q}E}I%E&Ajmk1lGb5|<$=7j)p&2B*Pcap_o3p|-a*vM( z1q}!SMoRp_-x8S(?1CZ9O-*swUjmka&Y2`~VSfINg#;6_|0!d(+J!#o!AvheTYXky z2*mm*R9_F7>eDJven0tIz4hxcqM&E?jW_f2QgqS4XbSrlv$_H_=JM~WKOCQ@T@myu z(9}9xdwcl?8nx@`HXzr9N(G?7~iAKo&nX~nE^ z@gwXPwS0P$=Z)19lNXQ#OPN@l=n%-hZDMzZc5*PbIslytiJf_|!`8D79leZ7fE;+S z6g+L(8i*$JI$sxgL7O+EG;0v@Q*^1?;0Sg&-{U`N&zFp_O z1k32MaC^Z5=66xtqcc}t>~wk;!TOK z7m=GkFdd~#Vx4BwoZ)n7zuxbn+l{Bw*2?;JyM>Cq;F267ywt*3W##gU_FL^ZMVqo1 zJi6oH5@nb_g-0czIU(LZv_`?=bv^_maFw}KeQ^|Lelsx~1|ub@oJ($+Aj)_Q7Gj%RI|ReZt`VT}k1lWno4^%79#H5MB~TQW^7iqk)U848ZGr(h=g3 zJXa%P$GXlcVyRwbAqu_ zM|L6;U|wjnH~9RyfKw=++_#>8gN_FZ*r-t{0cjyr&mb0L=E}n>LWtWKEspn25k}bx zJ9NyX@7&-5+>MsnRprk-n3Gf)F$~M(m=oOVrOi*Z)9lv<5v>agD^SQYY8t_KJ{v$y z#Iy6&L;z*0jidg;N>T+0j)|6biu7@#GvbO zVr@0la|vU9pAyGS(+q!ivIM|toD>U>NyWcrq#p0LVq&ID>a{ISmgKYz?5t{SJM?t4`K9x`IrG%a%<>`DnSCEd z@F;RmwfUYZeP67-cvF>iP%1m``e2{<9rvVdR?yj& z(IR<@zA93vYCO4mTu^_&cyB?aDj|Rgh{POcNDuk)J1bKK#oHBTcM~VmC6y$~1?$c_ z8_JKf5+BN03vb7wONCrj;k=KTAhe1t6=c)iQeOAhMmKL9633G19Pm(Wy)5ENoNpPB3(;^%dkxxpfF;H=Sk5oP}j z?7{Qz6X?~;CN&MBvR4~y(;kJEoUCNyGAU9S0sY)FK<<}ZPk?UOUCwIE$${VT@BK)k zJ~frw&`^3n#8*tD&$qv8DonDoCDv`tr}4oaLISU{{Wi5(e#|f7`YZ=#UQcbO6*-YbnwNfdNj550|l0t#dUI01L#{Ac@NvR_6N8w=G5fW|2t zoJEIO+}Z~rH6c?k`)K!YW#%8ZW&D%R?^7{K>sM#AEf^2LG*!H#a9DF64(cc~Q^@Q0 zv+*p;drvH_^8{G!S3d}3s>huHy=M6j7vd6~x9v&?Jo7ZseBu94tMh-T)pB2Mo~NN_ z(1d*F@kz})mD(pP%xjstfkRZFtzh3TSR!y#$>k}KABFTfP&J4lxDO|3oE6p%c&Syt zwI68I^ND5w?FGeu5~Z>*ie;|PB2Ii(1vC-zd7$5mOnfE-k-!0Ug{}$%-Kz3+1I4!} zb#KRqBf~VJy28_))zOf88BHE=>>CGu4FA!hn6wI_q3_2JJk)Q$(%lQ2BFQGnO^?i_ zXP92X)aGd!S&A&Va$Wo1SXYkt>3z>-IALDC5A}P9J#)Mb*w5=Yl}zVRMXmr>e7e#q zmZRtdEf?f6Ok1c)_?&8P2-HHIoBcSKXI|$^My&JUEoL3Zxa?<50U_N9qF;F~AFoji z$i?a%(G8dq`{DfTY>KPB_175r3hKf?l3esZCJL%$A$vla>W@L3l^q(6`)PTFAdjBn z6Wmn#;+mS8qHY;a)iQ7yJWz4c0A9TTJ16CNk|lO~-BUofRx>pPKTX}sY<8eL25his zh*c@u3+)50*3S&p6A6{*j_Yixk++h7EdARoyU)Ka|KyuL6DI!DlBNJbb4mB}E`w)c zNuL;sz>G1*j?28BhOX}N)Xjm%4uT3j7cLN9U*m~^%pOjTzP!47cPa-ijFU*y$?@g` zcm*ubh^_)EQYanGa0c2YJl9d2mCU6d_7Q?ke>YsllIDf%5vA>rNooNWW)^4Bu?6*5 zt_hs&NA-E8A*)xnJ85tqmD!cApm(G2*>B^+3MB=E?1opylh)i$L*Y&s0(x76gl$>w zQyQ~;3O5a1rPpKP##1@>^HTI;i#qY5>&`3nAGv{&b2Df@oTwgmNis!1fyFxghbGI%j?G5PNSa$G{)XOh4 zp7_2}$q14|3+f4L&fDV>3S{~9Pq$7^>(_;WL>}WwLiAxuJF3~R=F|KOC2+8pYx!>8t_$L zF8~vr#&**`FU$nVtRP_&5~sjX(`#0+EN|2o7>L7An%ufvG9mVnv|PpD`8V@3zV$r1 zhPzuEt~B|NA3ypBuJXe|7)w->a2=n731$l3JY)*Cb{Kmlnm-6tYrIFG%MA^`Uezh` z7e+^iI54Yyc?;^^_~LeVx-vGmt$U@jH=drtd$nS82XY!uw+w;pE2Mtx*XIdt< zAyDpjbXc`Cf_GH26^BXp`A!XScvvspJwYu`dNvE*_~+A$`<4{hDu2h5J6w#SIt99> zcHMiVuV7A8A3B}_8}I`Oxt7S6l3p~mmIatDGII6`@gj9?rR(q^;Wt(E_t|e(dih%q zwup(>V=zQ0CN^BJk}XIAg%#2K9mXGNTE`Y<32OY_$^PoM9A`=MjYZ_dC zf<=W06s|%;^_7BY6|xfgf@;CRxmN#>L^&vJcg(d;>@!#bdh3>FX~~H;EYB{J_0Y7- z_o%$a!JY4?Ms#FB&eOV`m&9v3|2QQz7?IA%D0RZ9aH{$Gd+6scD@98VvTW7jg1wup z%xR4r<%bgA?Fl0TDe=od;X(0rKq0vIj+ony;Q5RBXmYocI9yn-zk$z#;j=9G^pG;Dd z3Ii9EBL&>4eb$&rqKxs7Muyk?9MOCSkYe@S@^%GA?bV9az_Uck#yrN2nJU(-gh&-h zjI089pds!6aWabumFy_XDYoG>SRYt_`TGrNE-48gs>hv4fvHh%B} zfz4aoG*F`gx0@-f=#$RYT;z*Bnto=?E|j z&#u73dT?=ZpXcTw8weswbbViLatXq8(u){sa7?T@wsC7E#I4=KOv*QaGoLx2?6-&c zK?s_va?f)EbAQ-Lx|&WH;u9K`?#PMPaIRf83p9-E+a|ML?4&;Q6`|0*JfqR-kAut#t?2d#(N!WG z0!;ea!P0r}!TStS>dkw7QEX0$vYvmhJ6&QZ|A0ZychdA!RF#Hxc7Oze%wn+$^#aA8 zI<4h&0V{{F0Spq}HXQEIl1(}3){32)OO*OfF=68aNd*AuaJL|&lg0}HZ75V#Tn_XV zQg^lzT>xs+T?a}RI|mIElY-ik2w+kmeh2^H2+nQZ_x7DHx0gF3xDp}!cYjJ7-L!ZN zdJDTj*!r5v%3nEQO^waKJN9`Xc}PjY^`~t~uX>nhGcC~Mi>Hr&IHPNd)-On#v4{DU;fJ)o`B>Fc(3jE*vA?c!I;0N z124fpAy~5DZS#d*`W%fM*wiF%8OwX5KB#B>Acq4Fq|a*dMkXo}%}-9xd^;UNpsd@v zqCVWK>LV!*Mcprg1(rskMx{QX%Qc7HKdTWIJOf;th(yUd#CyijW zQy@bZ5t@wA;CzxolA-U$JCevO8Axb*Ze7$?_Y*LX_ifLG7JQcJDI z5a>Iu&F#oF_=<#-F84S6B7dE2F_=tdYVg?W;f|OtjMn93hU@3TdNY~Zqp)l{fsGcazWOjRF$o6Nw78PJ?8^gTlF)c z9h4K}>wAu+F#=?+%o)MIf7%H;_%3Xe!UmLqg)1c$6*{$t;H`s zg+IU6ecggr;@HJ;Vb!i5jKV*$L6+KjN0tEx{=X9h_yfxfvEHsI3=I2g#v7lo-%lvM zHWV6VPndbL!kaH*^lp?$5#geZ=8&5ZNWq?p${lQ$1A&zT`W?IJ_{47le&L*snSm6G~(O9^mbM9z;9;b3*`j1A+EsV8hSSvEwb5| zqX3JEv*z>RJ!*|H@8f>mZ+AV!wuc?qI9W)tNz>|Q$Ca;FNn~bG20;^p-1=`GuS`loixO6Pca8f;~ske$R(aPB#3SY09q|HLVVm zbvmR0gXPJ9!LzP55!+DJoGtlWxT2CqXoT#A$G?LC@%LoC4+KLq%vujeHcHSIV0ZJA zE_Ae-!KV7W>xJwcbm1_Ki;wR{8TBm(eg!xs*G+P2N5{5CYshM{J>?=@G3h^Ge(2p% zB~1wx7B2QK8a#)L8qb;4%}D2FC@-Zh|NTO6%i%Cg4GH_#EI7vmB6kNF7U8AuKJRg< z2zJ|wd5^W&c*10I%6Q=SEZn4TMd**YW-#(C0=;OdLBYFNLcGImdNs9kR*u>>{Ic~t z_@Cr4W5ZA(CCzpjiM)0y^9ls{O=GDO_pFD2i2VwM zKIPoSF05{})K-Bj3(d>cp=o@b31MYgRr!1oeDY4RPm&N2S{I*QRMZ#5C|2}>W zw4K-EJh1M{3E?DteB-e^=QA03{3;fik$J*uB`zJT;ej4X2FW)>5S>dcT7v%9O+ej% zMFo#OhuN<6RBs(KZv0v7+I0I(k%4WjQ&!A~qiijzYb0=3=Es)twE|-1dGC({?puPA zDGLgUVj5A@BJMQTS%OkK%i9tKn3P_9N0PtBngkg66j)T^Z*Z#4p(mxhu6v0FvdB+y z0+Ja?(<<7QRnoBM>l0)e$_Fhu%sZ+f8MA%yDD8MNCRJ!fmUihayREs2kIs6_%Q@J) zKb&LtzwcH-@~Ddc2}J+i@YchD8Kfbb%d=P9lMoce314V3aJ$A;V3yxE;DLvDM`#9d zDG)Be8S0&(J)fr%!vvRdaB<)oQa-1uqpVT$b`Po@V^EU$j8=pkZ+e`R71C#C)*x)G zd^gT;nlU;qr#(l|x-0z#5_^t@alAngW-S5oyWQTHcXgQPyE|R^3ij z`ZEsi^2!o#e*9vU^PIJEqJ&E?(w|i%-v}@eu!dU%$!pU-!U+18Q&Txu z%@d6IDXUzDFIW@PRtS#e8>lLcGtSvDoqDk*+6VUZzVEG$zk1l6h~^~3*lncLo3}W_ zcXKSs%Pr%IQFZH^QIm{=C-jrLyRD z{EQISk~zjQEl3`o^TtbZ*RI;tZL#*S z$p`3&MD~sp6LaHVqL-RmteSv}$f0AYdhw0+iyzZF?s&T@{$(cmpO#NQA{Wb4I9$rh zYN+sBiU&+nFcw0PKgRzxcK*>(e$xk#VE6C!qt`0?`ot;Wk%s7 zK9#s12n%ZE^3y=eFYl-@J;SE^SGW#c2WVEc1&%DXlp6I$CXVfJR>oKgW_3S1PdFXo zpSU1393y5-zPD*yV%E9cc`TqySjm~TXpn2+CFN2F6;j~B!9sdL)Uw`69|^d0&E!kS zs1s|CeW{~6Q46R%&HPQ+Xkhn)BJ53FqDbP|7M6;o*KneGW#aWV5*4MiH#}n?5^RrhuRaLuNx(noQ8D$e z`vWeT9R=&Yjc#j`R3Zfn;Xn{{qOqnE{_;hw+h3|oD@9AY$7!3|20889OHH`nY)g99sz^_5D6d$IAM-jJeP z{sJQ4Z|3SV7M9l(Tb!MY7z@^06n_rU|Jme7{v0@T=iZqtqK$dEn76qYlsG8`%{QD)%El^N&YZn%yKvhXRicR`RbVXTyW8% zIY2UCjkH{fNgY`QF^0H7SgWR@Es`e-_H(|%ELv?rVnK*n{wHk$mb!lfi7?Zotq60? z;apuZh+!qIXj(yfg0rtKwS1kwq)c$ra;;M5gfzX~OCYjKs^xPl=C`b3RT{@!#5kef z>u=D8_tBe8GSk~MXF7cEcQ80dv3O#P$`eM3)-FusR ziM(GexqA+BhT?W3a>H^_GAD7XjkVS69E-XQ4^^FzJR}%AsuTW?q<`&0*%{=*fa%qx zAEWEib^Y3l*?hQ=&C|_62K^En9RPvh_=lJxePS;V!Dy1y;8JgppcFdnLDRN?yv>6u zL6?R^o>8|i;y<*pvuw~YSgR!>MR-1KKf!2n(>@!4kx%<3^u2m5wJxt zy${|!cd9Kb%Ge-W1YEB0{fNzMhof)IzDEh&)18N(qW&hLe_#&&;{;ye7`%Dz!7z(GbY< zkQLnX+{yTwBqDy_vQlH%D>jf%h)Ha-x?XQ&>i@GD|0z!BqLDxxhksJtHKm|1JKD^! z%2z2Lp6=VYrbFy)@ktTiHdojZPZ<5xn<>4sJ!oZ8iOWWqg{tr9;2|Lvl&+m=8q1-# z)7OEnCWT25rmAJ&b{8C!RB`X=B2oR(&yF14U)E%Eb64(Ajm4)25YO^m~s)>pP z860G`IKs^6bCGu9gfd_Esv}IY|FfO>8l}2H*6_{qhxUJF^q={iiF!U=uu;rAjDii} z$oe=TC7q?J^q1Uxiw-{-Qy+wliHQZ2iao zsowl+xcs?DfEmN(hi#-b9R+uX$g|Z#BxYQ%U6AV9zLM|4Z7DCx_PXsR6>B82 zuBp=dvXn@`%`Nne`~J91Up7Qhetlz+oa!z!5`=c;@z8AsBowY8gw>S;ZdqN4^0%s| zHz+Aw@`i7G`Tu9q+WlEvScyfW%X%ujCP$TnV+Hgr*Y3G*JhNfKlT|sK&o2-J!4&KS zb@?`Lzb)qNGu~CqsQ^YrI|_ zr%Yn*>%p6T{-R+0o%%V;#1T#>0O`c=%8K{TThz47#>OZ62Y77erk^c?kd*myQCYMY zLhz2%xLSud>WUMv28&^^Yv3XSe1%rer#4?AtYtX~2ypykW(c*K_6mW`ayc<9U=l^I$Y&IV3twnACZSeyWs_ClU_3uP}CC6Xpw`ZcyW5M3!EMpn9H9uHp8= zXk7H7h*}JuJpu%rk@n+N6jsLyK?0A46U9h5V)6}LMXXR6jh3iN353vfrLWicYm8AI@EyFl8%f73qY~N5~IQs6*#aJz5!TyJU zl)|Ga71h>+O7Rk0}H1QN4AqWn+ zg5lTRV|kj#&Y$=?L-p^C6BPECX#2=O5PF2|sSf}yR$dee|9TYBGJ z>{~ASo0WCKJz)IMG7Fu#oJ5+zNc=eMVxtu^dst^hYtmH3DJ=y7q26jcH(rlY`Cw__ zk}vD?`+^`b3@i-ozrxMGN-q!_!v(?k8a{5Pxe6LYtIXw0S2V#(?A#FSe588x4Eds0 zXEpBt#2JkkIYNEL(h$wv^(lN1#TN9YIVG0{vSLZw=8$*NM3$xy`>&j}3)m<}b1YEc z2o}FAJres?2-M^?-&T65r!Z2#qw>PTCr@049d%XmL`OF12tEBG=$$I(mzyUC;($D+8HA(PQYV7VcjS|V0D(RbI9Zp+#MFUXLHxs|q4skDB)ju2si zryxINURp|-92NSR5`9Nn+((|2^14D^2B#qk$^W{pb#5TbdkJPjr{5&lOKE;*a_w19 z`dQNMO;zlOR^-=wRIh!Y-z4lPT%mLSWV|S@-K*L0e7Psj^TAP#&-gA@!fZp%#zJQJ zugM~*c1Toz-1guJT+gWpfk7X(&>fq4;1*3eY>gmv8X z$IG}tcaZ!21Vj{{+@M#enPO{pcaT{$lB!XjHN64 zIGSRIXRhuPTVy;q%J75hQ-gXzj-1)afe+Z8WXD%B@2J}+ZMOwdURH@c{kf>9j)&tQ za>TOiCEBz*p!c#}qG-$uUkF$fbHt+Qmab{e0;Mk%p3{$fEkDC&~J7yL>k>Sm$Q zZ){>*am0C@LyGasln2zRUYI^4+I7Ie$vvV`>@#ZgutoXlzeC9zDiD{6?M}+Ep2Iin z5gYenxEqw^bkmipmQa1a9*Kg_(K>;!TEs#$aSxgLU^&vpd>8LWeqb83HQLucSNy-L zHv3gTUCb^dX4S}Tl)vq1`b7s{R&Zf5xs#Qr%Av7*5)q&6$0Y6AK7v{D6}wvqathvz zQWNU^p~HrGfM$USQ2r4~YsK0*A<(#*_@3w0E zNo+*F;zB}ptvv2;6zp@nJZR*Tu=Y`hVhYU}^*2aou~IBihzmkQgJVYP__l#Y*o7S2 z|MQ10tzrkxd^QcaEmm2o;fK7((;q)2|JOOT3k7mULGZy;PcK8eToP9OHVje}zFMI! zl;iC>?_CMHC**5`tz$;9mRapQ|H-`BP5AV16l}u#G}X59rsf6bqMQY^t@SoH#a)uf zO~tXC>}aT!?yoR}n#|=5Ywa?#QnSIaO=#~VaS)-yR!dXyD)jizf^wre0ly+8N#GHB z^rW&9Xwkx7m9KpI!6Wqf`@TIdbX@??f9pQXb3>N87bCra^{*l~tX-U|G!O#%{(uMe zKvRTsXi|!XzDK_e7w|8w!s(wHO&uMeKM)}3VJDGMM>3k=pgy;Eg9mUY6&3xe^AnI4 z0>HBOML)KC%<%ZQD?NsP%3uuf+kRe*wzf7v`eZj#BXQfWA_i`4Zk`Y9f1--LDlILg zr=yFM%+q;cZ2{gAAOAi|^3V-N1?_C$_-4VS%C(hn`W+!9WrlZ_V}cQ{oSdAXoT|df z`7_Y?e~*bN!aB9hz{t2#Z><45GD=$;4?8hs0T2)X=G{5eL@mwTtN=~_0nt~?nB+U+7oy)u43O-lq- z%WFzhVO;2E=+6m<^}cI;^&p4QwN*3_zt{;jsEa8dau}G4x0tQBO6v(u3Zqpi_;}6# z_Hn9UfDQ^7+;ssYxyUsNMSW)gz<(cJP0~VP84$z7! z*+}jBPk^%DL5#qD&!wzX81mun^klr0{a--L8KY#s%0cAieR8f4Gt@Gj{Nx2#<)U?gNMuK)^t3)RBH& zAeYu@MEVMA_#3mT22lS4m8!VB%niVNC5eT`vr>hSTOlSIOo(&7<&DB6)XG1HJ+x9tM z$HO$-m_Li>!UC5+=>8dQ@8xlYY{+m2-C$p{>S88TKTnAdQ{J6veQ#*0AGmx1?aGYA-VfhGE#oC2&L6t!c5|Jb(|Xn~s<6&7^S_3u(d z;4sjvU>p9lF&h3Q3`i9>Cyi_H2OJik0G|g<+M(^?1R`Ht59>_yJjp0{67b*+v&J*CI$mwZhl3Tb3_Dw>Ho^INp5rdMpdvU#p$;$1DWXoTka;}p4~`7WLI6&( z*zV=lcmgISE79g?By9lnu2WJ{x_kkg!7fN5g=94Vy8dxT;`eN;+gYAe3}CG53Mg`b zUO(_6iUa8rv8W%pFl4gW6bKy-y7yhc__fOi&6qwu;!;k~vAg$oR`z2c|I@w)orOWO zA1?6Xmzm`Y7J+%N5We@AJnHvm-R18ZaTFqf#{RN~C5_use3Vb7;Ow#~p z9edxWB><;0z>yE?`S1e34Izc!{X8B3%Mq+yaZ%5;4j&u@j%Gk2C|*%Zc7p>BUF>x9 zl?mN$tK8-3GBGC8IaRLVoz7Hz!4t{JdKkQq?s0ugUH;DSu(aygul$I$C`5cN#0YFn zo0V!47^)>GY+Vv7_+2v`nJF}aSW4J)fWO|T^^-`c?07r`tZ?3azYV8Lp9u2lW{L1c z>miUl1E$L`5e+j$t0dm>b?t=UR?0`&R1R7J0lnlcS|sUCn?<(9e9e@eSPXhRA<&09 zKERs;@GCq=nR9XJvPFph1RF>Mltyv}KZttuty13(_??|*3V4aiEPztlle`4kr7YgF z;vsfu>-xX~CS8MHN&UE3ZbzhGu`c+(54{tE4hmIjU`mf5$ox*u@mw?3Rffj!B>;@P z-RJ4H+GNo4H=NDnKpXF|cj;o;?2(qlPaOIdD)8b1_;WETIG;Ri_jzzZx%L*4VBfdTCS z76}*ddH;7Xfhj+!nG*A6tqSGRpeZ(1QINd>h0EK+gfA9+Yk~PhCK8NEW(;OlY^*vp z|5OlbjZyd|D~iM=YTPG3R(;)E=*99XW)}VD2=}*_JCTMBaDQJ0yHZ6eQdC!D8go$|PsQd0xGx@KQkDvlbY z%C-zw3kEX7{2a*H`k&st;|f{1l}iC`*CaILvR%pXR36NJh(bBM2L$Z-gwPw}5+PSa z&vZilJ7UY@L+2$bg2-y>MO!qs4J7(63(!jb)u}&)0GQK%v&9b6@1e1v09xoVH%r5m zO~HO%+b}XSys4@$k&|6>!&x*nL6dtatVT^fyZPHS$!gh1UZu8V@<+ugsEDxaY>2p|wq50=+_cs({<2k3 z@Rr^I$zCQCMH_Q_ZtdAFM)bB zng>llt|I_dkFJKj@|8W}t9JK3JmI?Em`|)0=BO#EVcUAxr38}na*y-L&+hJeto42{ z))U8{l{>$YcTgd^#e|te;4`6TzI378KX#435iGwiRem#H|B+L?nsm2-tWyB})v8G^ z*g2=Wd^5XjY+SIolUR4#g@h%~U(}}5hC$$!5y7dy1lA{055HTK3M6xW6Xgcchj)Ru zP}^KRWf(t_s@s~E&O+vAIFv=SY{yw&L=Y{RU?t_!Pa)<{;3LWvvPdRhurXBgj#{jq z^#+1JWCt@$v`SR$^KbC8*AUcuvW(~)AOW$zOCW;VvyKmy0Vn}tO*0V zbo>s}Bw@}v;0t8(rL3~4ew>P42O@{LU<+9QsW#Zj-YBuUv$(t@6)0lk1)-Jl3<693 z9<%pIZC`Lq#z(r&Q*gqA^fa)yc0T;~xE^U4u6KjCfdvC43j|^J*+T0ZG=*CnUc`B7#e77o&rMGJ{A=sGq;`h01~{n^IjC53|KZmWi4QV55Z}&g=mMSo}@yk!1!^m zcTBCR{{paL-L$JKg4LmcFlG$~3)qn3UZGe?Ei}+PhtwqW&@+lz_W2v~wS!yD^86-Rp6tzLe$mrRQpqbIlf6whvVj^Tb!9 z1=C?HusiDj&fG;EzUQYaX9O&ZG^;)j*B_OB&&4JMsnWV#*+f+`ZJ7uchWAZ{xeJ=- z7-OV^Q4=6rNr^n74kjsc8Ry;WO2X%haA)w2Wi=O`_YllYYHbK+(YR-I8IwZBigXAI zXR$Se#x|?bVJIfi=5HYI;?!;`mrwb_QIkLr*aV8Lbck)#W%5YLA2|PZ#H!ky*+o?- zIcKg1Wb~feg74?d@B_YIjU1q{1+t-AI;?l|Cb=mTVG%vklg5zooG=)45JU^OV|V`& z)U8?`ep7AR^X*?s=Xx?y=^gqtns!Bgkq*|FszN2TKAhf>qTSn2ka|(9bx`w?CB_@V z>ff3#hZnor5{gm8d+fl6*n)!$@lOev-0#kdbZ`5Cp<6eodvf8Sjs$GkjyATheDXN> zoefS%;5q`BkCOz_lP;+6-v-!wNPTUpdwz5N?obC?N8RR*CgpYf1uPM zsZE#@;o4=#Fbz8z*=|AXs$C^Q(Y2a#qwn0qn2CmLAWmcAPP^4-QW2~1c?6aP>wO@X zw>lxhohZ}T(tFBmIFz2RlF5#u6y$CFm*1AMcSLa;EybDL(qd#COu`>NT#o z7CWih8ZHQ=Q6bQRfXZB`Cjq#kWcjS%H=*PDO-9dz-2?r+Efb_)QJei=+lAMcaJygf zgCz2KmiNV-b(I?KblN4Evv{+4pKaC$iIncY52TV|O+7FN7O}UA=2-a*IucnIRO+E| zDSatbjUGGZQg^gEOVMZ-6AGE$V*e87qK}CI|8c@7Uo@p424h&|PhVdg7S>0knpV>N zy5i%nX+~WcO|;Y=522>>fXiX}$}R@zXqY{H8|Q6j2=#7&XigyL;mfA-FpPceh)a zZ|0eI?jQI?Q(blHoVE8}!kaDZ`N+GSSc%w~GSe_rL_DC_EI!k~toZ^Yrm;!1Q$Ubu z1P1KZbJ7voU`L$xT6!PC8hv+CO}q^i&xP?6^81jk0^#flrpFyYCLN`OF`NmtVEGAy zE6Iv_A7=Fa{;?nU-#w}5o_JEg4mcN?R1@+bwJq?zX_Xm{9yt$3?-_Jns87Cs_L_MB~IPB z95+N>8yHlIu%-fhazz~}nM#Boa4GAk!aoW6EN^kaw#jS^?QqBU^76tKjC$CW3a_c* zeH1*~DRI4QBOj&}C+~Av=t5)^1nI4p7F=t^FNKJlV?cy@0*07cPYanx!={JQkQ06s zV0kYdDL5iVqj#U_>L}_C!!Nu6Y}j^6=C_j|DdGT@^HjAkVl|o($GP{}!chHznU8mo zmypimM0q@Le_E;ZY~z@EDs3zM0iSxqw@OI41iwrCydZ zzG)epcTEi=3WC_e`76^a7Z%np57jR*tXOc5`U$oWaW$HFR|Dnv9+#BB6)Lutr!}nR zbG4an&sqy_0v+6l6YwNBprTVh<^95rl@Fp~^XN896mZ2|;1O`nP+?|(qOgF$?;34d zaYi2Pqq((!ONHRr<|ycH$4dqOhF~>9GafQZble2%XebmhkU)hRi5 z3}e@s0}30dddMA-pX?ZQHU#0X{z}3;F&te7Im`@OSJP3Ah&f*X?m2}vkL|`nD8t}) zus~{!tgI!Ia--5gKy*7~Tu{G*%Q@926;}X4JFrJ(`TE-D_hN_Kes*PC~V0_F=f< zsrgT&1Pr6Qj+ML{jfqdt>y8$tz9i-&@9`bXfacDaQI*&SfYxI|8Sv5D?@uKe0;_XS zBst1or+YwP{b33LS7-4nLlR`dJ)k5-s;joa!AA_uaBRq7Gl3iZ$Qk@bEX<|9+ChEf=Lj) zWk?JS$F!pOfvfK};$wpNka(b~K`YJfudR;-bbK%6ome0@-Uh7+6$7J;UVx4e9kf?n zBq{w65}*Ntp$^X(7O@EmIP*Q%PC#^oI=(eEJdoJ9j-|H-|f9cj-u=wY@SVa z;ByRxb8I4x{=NM1tsYMi!-VpmSRvWvw{nJfpi4x(?lZ>_;wBw zMsNzC;%gRUEc@;BBUEkWC)Xx@Qjoz$9r zX^yqbSiJHV;@w=rgrhiwcl4ItLwF zQ|D-k3(sLpr?Sj$DQl*)UXX9jR+Y`qfV!<7_V1GW#Ikib!A$34ysk}rb8crhtVqRt zl9PEVEnY6@Lc`EC-gRzjKKOma!%AX>u^49WSeos?htYd`9|>Mb1Z78(^5<55>mjnb z-=bwxNy-Q>6|)ePpk%8VJt{wx6Huj*+|3bZDp$uesL&BA8Y{87^%1CzYdfnC@CK3FP5??g_GW-? zc4jb4`rk$s0c0)^Tk>?)g>LW#U+N;5ffCFE4r@S+(^}&h7&39%3{l(s&16Y`SCC3h z+D^xdXlrZUPGW9B0V$!EaMzGMw?tXcbuqm6wz5|St7#;seorc#H;4{uAvOA92z{>O zQXgQ>S%EGI0|6V#?=oJ*P4NTaJe9rTlxdQlYA5jv?59WKABXnJFFg z^OQjElC*;4ezs=IzO|VEHn_u`@bB$SfW%rj+a(gB%y3B`RS5!+(o!sh!Ik)sSye@M z8jb~66b1XbW{?ys1JVfr%LeiX=BHA}_;<9YfOdDgWD#&8%dRoll=wm_7}c`(o%t99 z7|*bVGyh(|M z>x%&!vI}X&auq{(o~ldW^)N1|qIq*?-pe%P_r@fP!ZCsj?Pqckq|Z1BOBpsfYu-l7 zNUWsy8u?Uh!{}ITH#{c2jO8T$%lY_Kyc}uaEkT4S-4SydnaSh@;iC7v6(KBI=kshB zKdJ4iCXsUv_k9!G&lvslumfoZfVAHe6(C#_-c!bQ!yE{niT25cKK@nQW_exkTcB0M zM9>*9z$zypULc?PHcttVP2khD=1yIU zldV$@pT~SOAV(s2V3J1&d?jB5P9wDnSY#~SKuN7Yp}jf4Vu8kSyX+3d=z=C2lQ#lX z-N2zQL{5p>_BW!80>aY(-UYlnr$mq#?%9Xv*yZ;U;_g@8{8o%ns zQP~#=1=M6pZvlJP$S1$iQ;^9)pS>KSffUk2khOVHvB1n|mT!Bm-Aj299x479edzsGy9C!3N@oOS?6-4_JQ!5GE3 z|0inkL@ofK;ru)IhwADeuh56Ms1w=A(NPyWELrGk1`#7}H=xgz13vyi zi_klVT4jFhX<@&{Lq-(X&A`AQ4hg0}glx1Te*Mbm*=%C~9DyMufz=hap}spO%7HE% zZT@AQ=Z0c8KPq9JTJaT4LfX(eN53E`vNo*;=K|>6!pG2|0d;H+s|D62UYhh)jl{Rp zvS883|C`|gSm9KD`g~CWL6SBYR^!MsLDHfE0r$xh_ILz2j)nkW3gEl&&0G zvq7z1ny8=?G3GXnB@DNs5vD9h5d9cDf6s+@53wV(qiX&OM&U-yq`(!*?W5>Ne5LLj z!;irfcqE&6hrrNm(3+$emU~*%;yuvV@7&Mx_Zv>6Za2d)Tma<(`2syXqN#{N=yz7n za>2H}WH>uWL}7~wJs22?c5C75h_)jlj;JBigRtsUP;+PIFU1H{j>oh94bP7y8j_ar zrZ#4DAxh$YlA52uoB@F(>MwwmEcOvyb;tHMlWJqld8h7tl*%(rvF=M4P2zZX|K2_@ zZ0aZ;$+>R22SjVwIS`=-XH-7AfvX~04~ZYcp;I$&x7^Ji`3?)^3cg^#krm0Z=kB-5 zH7jjEu+D<#;)Kgy2Kq||iaAMk2V2Hw5C}22Y0znVfJvtj<>-TDo|E|p#C^u_e5x;B z*Mz7M0;R-&q1z9^gvNscRkYEefxOQQ_doY8UY0ChcRN_ynD3#bpx9d^IW3{>6A+al zCoL4O)0=|DANiY@mKHTDT>0*}X3H}@1yP#YlWESwAlJ~|h@TlZ4d37AUQil+H_-m@ z8p4}wPlfdUdg_m@Jx!ikP$@INfAZRq8q{n>pE>tucxtjjjWiXZ``=uw2u%^~g znfXaD6cz_h3Ohtx66xxY5z>aW+$Z}}Hw5z03gG_>mgWy%1k55}jA+A1H!bO{jewBp z@7dgIP*~N3baluj-WnD|MRj&pP1yw>S-n-Ur!rjExxY-~7(-c*7PSfm>~Ji$$s@ z^>=}9R05BHAJ7eNukG!znBaP-H>}Kp~@4@=aZx|dA5zzy;TV#|OW`rxh z847=x|Gi4x7zIm~{PuF=s{2KBXT^I!lX6M*1*1{TC{DLS8u*d6pQ9%oVM1g#U zobC3MJv@P*IL_p+&W%n zsOry7UIV6%qudNgcl`k`Jqn?e80LPQn2crZ%shxiv;tUN(LKeg0%V97r1#@N(7{Rq zfRBMCnfX4M-#uh~JTEn3s9@m*x`EVG%@iInKHjz-5EG6m*Y|8{m>h|~8ha9mmP>fY zLZ)grl1#U8a<3L@wS=Vw154&evWCs;d^V?0INKZx780dhS&=zdWu6ht`DU-LTJR2H z;FrH@@nlQ*GM2Jczxom(t~va&S(&@Q6xsV&c7pP?%_mvywT79g$HG%phE;rXisQLY z*oR!pjBpJKPG22T#$)<#xCr1(0PgNlaT1%6`7KyOrtwo15&Kuf#j5GefG4zh_*d@g z{LLu*E>3*R&QPy}Z8%}ooB|a@*ve;noUk8w3=t(Z0DU|3V{bcLk!3xK zGqba$C=cZx^0)}ZAcAr+JrA@PR{AAICNiO@k&vS%loFCPs83Bpum7qLiIgm3fQz87%4&Id^bB+!KxjQmW!@+vsJQRJ(Zd3s4B)Cmfr+A!0iR3N(8^x0c$j8xyaeZSp%EbgjuN=zI zp0&zq%zr_HweoNLZ4w!zL*Ba(5l_s3vJ$K#&3g&3Fq6-gHv!%U=BE&6+jn&a3Fn70 z9c|(e1|OSjb*u9`+4%?V`~S$Qm=sRL1s)s&$DIWK{bm28KrUe5AZQj;yH>MVl$aXk zeFa*L7yiOHkjk%U(Q-73{?_7X6*YZ(M_N!hb~0LqJxh|;?rdK-Oxx@o1Btmy8QFP(y zYgO_H5$U50$U}TvlRi(KB<6qkbq>As>sLUYX!~2Z6j~Z4wTKh6TPxkywAbBtZY0M# zzdRjjzB6|Zw2(B#`5WKQhcx_f7my&-4x##GUDR8$6+6e2ao;zB_5{rPv{}DzVBvcDh_i$C=R#vca zA!a>lY?d~-;YiBG_^;PF8^|B&W4jv(t#^dS4vB6zxy0Tr3CfwMPCN03m72 zWMukRQCS;H7Zo!c|V|I5@EMXZJ%FCoS68+{&wL$g-`+@Q{iuhcyS}T3VwAMfs5&Oxk18Da$ zYjQ=rNK9;pOUR!qMlU#U3N@n@b6{>1`~TsFcVFf+Vh>$*wD4UyxSgMt0EH)OW{cqx zYgcdY*0XoZC-n>1owQp-ato-`zn1i<1-%om=p#|SomC-z;U!fN%nOgUES(o>&pXH=W8>=;)QAw~U3 zF$Ltg?Fk?B5zPj}3E@+Z*Y@|%rEA~n8&exA(e6)gn5<*$p`*ZR577E2+}2+u;_e<5 z4znn^uzppI@e*sI2G3_c^AZb?6r25%@yLe_&`=9ro$@jkPgqNEdl^YEPkq)AxUZX$`lbwIVGf-RXF1DXOCNLc zFsqsUDsx+6;M>0%pojod*j6avW6v~%mha5ae2qR$i07lI8NCvl9H?Z}AQ(ZUf>ODH zZx=XTsjEe9KO}cS^R}aLhB2Mk98yZ>{HKtMycCoC1IBDzm715Y+?b2lguT5jC;lqD zoH^BJM<`;gSWb673UlaD*QZ75IUZJKube9$?hS>*;a3bo;`WBfG5Wx8q8usjnz$1Kx;AhVTzxnJsLoFMZhOc^9ljHK4 zU79oqcWvH#rs5$Ol^zvcxu0R6ftNT)y{MzI%KLXLZD^T#h3Jg@XWh@lZ+&iAB5fy{%9aCT_JZCf3&9s)`K%m%H1 z<4w`k4T;T!{=;ss4sKRCF7Knvq!BOE=W>+s&2V4NANc=e5Z4R;?cg49tooHdJLvdl zd3eTULjr1klpmFlk8A4|?>#verg zy#NfTglJ&sB<06P>Q-i1-e$c0j4tajxzgk_aXL=AtAI_+?;brZdYq1fm^L%}yuC4C zVm>{vci3g8^X>pwwe5v0v}~~A)%iMd5-;V{!sOEzo8wnAD}|)by#iiGjzSGCyIMzG zM0HzNUj1#WqhIXLF=?%f-D$HcisJck)XbCS(F*sg=MNKDHhPI;pS$D3{waO?%nH1_ zRQH>n>UPq*o7ySRG|*b|dk?c9LFC5Nb8rj5E0vR%$3fIlRUqz;lq+0aG!@>3WqKDC zzx)!zMd||M^M%`|c$~Kwt(8`7rC(k3`F+3m?`Fw#B7$+&^)?|wb*QrIcL!%@XTZ+TfJ7E7wW&*U{Ht z=)#NOW$a3zO-u$Jf#v5P^#A;V{~6{6st(w4JFNMzi_{N2+tj9?Y2R({m>KwZIa-jn zp?K&V92~5+x&`BYyL-nU*jr&PdE7N+`?x)4fKFE-%tidL99xLywK@2H&(Rw;0r=rt z%gOxT^DP|X?*=jy9A7vPn^~Ze>g)CTdvczPb0Ty=&R!z(ERl;rxiBc#{4tSMaM$40m$J$=oKVi{q$_jY& zy2ZX(SnrQ+aj3B^@ig2Xbec41SIl?5->aT)RbnFdN0Yo^mG=7YZ6k;22?DmgYVfII z5fk^3Q&h?9@qudkF?Wjg;UdMYnu`lZYeZb!*>Y1=wXkho2a|_LBC~qow0`;&(|kH3 zW6ZN_$D->|qrv>VT4iNPv&XVSC6WvD5@0p0qrEciUDSJFW0x^*4Vx}Lx0i>8-P$O| z8z{cfkGao6$Yr;CZv$AO3|na#qm7o3&ayl2IjW+^C;!ub1!#&%B@{aze12&a7paQ! zYMtcqIW#uTCE=maKV!46>)iwovz22Kmw#6;6Gv4TIqtL_s~4v#>f|;|RL3$)09UxT zX+`w<HUU6pC~si`&i_M+7a%P+n$4^}w|n`b4Mh?|=mMtDpNV8j1SXLurFxI=l`#MpQxRl?caxqS1s($~b;&Wxv4`IsI@G9EU}&e-NRS7L&gk?h`t zd`7E(8IS#2PABNxB=5cJCu0+>P-*&d|;rwl{xn zV1Z|8I^$)8m*92LRN(*r#9QQ_0~o=goJ(R~0SCOn*oLq$s2dVKS4(gF#5T6;;i1bu zKZ;7_l8vYF!)_wt*ZR|?Z|&cx&L=wMEvlZaf7edtt+gooS&*2b$wG^|XcCgqQ~whj z{e=flAf0gQ&7tpSGPf(uU)PXBZ3xHhZ`)cAyX7r{;nC-gZbTvLW*^6HQ_@(T4ugHO zFrQ0&4S@6-R(uqE6F_NUlz)e>5rcb$4svIqW2jxEqjWX=IdHL*xqn;9v23TFb5{RG#h>3mmkXGtZ@QFra`N3$0SpVoDh?~7f?rlD z@Xa10MH<--ZjAOjxGsC1f6N7!wCe*9VIFrWBjA~LWdcs2_kW59DTFWBf5;(;(#?}l z2fR#*>;!=vp`z=0%>vf~o4Il$sE)5UfH#a2&V;ng%fnb1+MN2G^g;RWA@;!*?sq`k zeceG+fw)W^Y-K~#(MaLVr{{fCB5rbACoiuDfIa5y;<7q&#JS`lse9km({QnrzWfw@ zPN!e93`aLD3rZ*hVg{OdNmOG`@t)?;P! zL#ni?n9-zq)x9d9rBSaqz%*GgwE~nMdM54B{g#}RiN64~6RSu(gCY!m;Q`!sQtxCe zB{8M?EN)q0XMZw=%`cmJAv!u2w5J(!evDM$nROdlA%p~wA&~b$E1(UETEvkGiuyMT zHjaVskdQXUyvl{Pk+u(lvpzb6!B2nt6#N`e6Qd?0D|ed+foP2}^gko~JO z#jpk5ad@IljE2c=f!*ER(95(BpL?-fvC3vU1pllwq1oHjXqw*=P|!N%g?zjRPMC`@ z7-UCraq%a(K|vUbF}vz|-L}0a!Jnx6NKgRR*z25{O<1#ufA6y?yTTEmhG}2aQeCq_b;m-pxM4{v678b%lbC;Kw zw`a_-sG@C-Tgbbk?hxT@NWZAmlyiwG@0e)l=t?}!)__3Ao_Hge z&g0tAo#>AG%Dt2COiXCYz8#Wg_*grt6a?hwvR)Shk0wZ2zEQK!(igE$k0UuTBz9;| zoI1~0y+UrEdO}2IC=9u?gzqgDh)-(`>wTs|8#Q%zs(Vw zBS{{NXW)ZrzR6J4&R#9})y@vc*VDpk>I7tnV3-BJ(aepBs>jDan&xi-T#7A zz@XP$TvQawJ=XQ$H*5fyJuV5>d@TI}2u^9G-;-oSu4KfQr?}ae_34_)GU1yUO^UkDWzk6XNjh{wlur zJrgZ>d)Jq9`rZs6MII{fePDTIrF+{aZO*-}Q{C1drP!NIAGwI1>{oE$>})u#TH7fh zx?G=&Y;)>ms@mp4D~2Aw@;4n(S%RBjSlOiTbsdK zTk|kELAtAsy{P4PfPxTEwK)K}=x2aYMeIvtj0j)?Y9YJrX_qPBRhy=e6B+#T zYhiB$yppMXU#vPMSRdo5(dp;+pOyg z>?f9usL;>W*4Cds1?ueX5igjl^8jWP{no4cItS_>zOv`wSDkp|eax`FDugT_H(^_l zWh&g-QfNV{n9HBe&B@Ndr4dqEl)XXIwf)uKE^zs*mSpc~)#s(1lGZ>Jo0QEv7Rqni z)5N=CWb{4I0|f>MJ&8T4>LPue#M5XH8a^XHnL@_K!#l~u?8D2ob2W8I zJ0@OVlRC=gVdhow=@J!i(5r1Lx8)u(BB`7mFJ7N+=18}u?|a7) z#phDH!00LJBB(@Yg#1-X0*ThGTfr}b@-mZkOC$x;ZNE#TervYSsXd$v(Yv6v9TWze zJ@A3}@dY?nVnaoYjkj_<)(8SkB+iX~rWBn>b^jtDGU$4H^{)3hC`_~Fyw>+XGI{PS z*KR<%6AP=)Gz#|RCA6{i{&=omPeqf}>Dk@rT~Sb~J8hBdKE%6(iASqu>a~TS6oi35 z1a&P=!2L(itz5P2@%?B_VqA>kf@{c6jGKIi_0HU-F

r?DC8LD{f@!dpeuRV$d> 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

=Yk?N zTHU`|TH@fv#d;r_0{7j#CQna}EP^(_QILuGW8a4%RXN8Q>^L}jX$ zKVGVgp>E8hP_On?df7x977BNX?z0HQRVMHnB=b>_R@tilLGdm;^ac%Cn!(|(=;%vW z#+e_g0x}1ER{o9eVcEnd56_ObO{!R~cfcN@z}h$ruf7wl)yCWOJK!%THTN<@L{FE7 z2J~68xOR4z?*grlW*Rvwc?Q+CKi*eQLC3sVb<}pRJEVG!d$x<9+ZZmW8p|EPmlljY zvXhKxHmMhdxE`!jns>`_E$%8*1poy(=XgT%A8{OSsKyO5!6=# zdnWk$DrE?UHb8d-K|jV;r8!j5T@DcAmbL0ejptmK#3IWpLa}gb^1sbph!@`u_Jxmz^<1AV5W`h)>dkwtnd5YgSSp#H@8emnh|zwWMpKzDk?#df7 z$jeQAS`TZzm-`f9kDwQL zlFBiCZdfYh3-x6%L#Eq^mjN!xexQM!N%acqd@sb?=w$4$9rMviO@!vfP)UJ~a{>Q&J^;y}1k2jTG zGc4!i-E>(rqS(3b4YU+v#d8ut8C2>8D%}nK+lM>LbK3{SV8`s}`Jai-HUmEEl`eUl zige38SqgB44~~wGJsHx@if>MDegB9e@x28A3q3Ogd8~%(dx>@6WCJMlA-+e%6bDa_ z6#;11Cz1bo-aYMgYQm5D>!>W-pk%R`Oq~^CnWNQmplf?UP~ZrQ#akcH7-aF6{(?b__&Z}KT z=yY?a{=v#1TsJNy?%|>1NSU3GLs#dIAH4{(dfy4(F;{HGRtGQgZd<>=1Kwa0t{upV z$<*P;Jb6MEwrPWNR`H{*6I z47~1)ZvPd;N$Sg?B0%_oJFp$DO?Op%599X1xN?r3Py+1U+xgvEg54s8Dlzop<9mmg zGgYsJPNRnBrL}}aFO8S|es9chH{7DcGjAG_y(?B4U1^Aa!k}89711OY^5JpQxz zO0m1n+3$AQowUNwpFe-|dUsx9RgG#spZ#UF=W=}U#-+#aRM@!h-4p&+)Q=|RO3hR@ z_~t@}U2E9ZbUm9`hdOX_49L4Bw+h^$k1VIr2(Jk~gW5ICM)S@}{3^^(AFXiGm6pg^ z=$%g?A5di>f=T(UH7uqFYD(dR0~c11D05xC?;5%i>YwgEs;_dJINa&ig3a$Oq_|ft zx;%h4oBMZeJBIGKkj5lFew?4r(5-nMIs6UTX>z}vR}0=)>W6Oi9w%E)bLD7l zaSGzfo50fh<6g!OzMIw(pFn{XRX4rOjaGoyBojzx<%T2}ImA8i8LaA1DEEVRKl2x0 ze)hp08(m(6z5NQu`P3W((7H(BX2vReErte z*3mlZY^{D>UuZpy`eA_}hI{Bk@%{B!skI(~yZr}7%)9l6Dzb;~(gz_pXA5Wa$eiq6 zIHS3?JsSUk|JJYPu>t!Ne((d1*&poh9A>{papD0%$zTT#kjbUS{YjWgseRWM>W9CZ zf61Qyo}2PtWR+3u5%6&BjVF*15MTIYGmvZKf4IAnZ?R5$N9?3v_;fB#Ry3HZ!XRGp zcst{4yu_;YwLsJFZvxO#C+J_Lq%JzZKrTSC^l<=k8}dGp`1bglLIINiGDPJIb-rCX z(-y1a7F+qDJZ;~W*jFwYQeEHP(&1@cA9gVeEXfNPe39=*xMJ#*&R0oat@X(Yq&yYP zgIx(ScaPh#KN4jRTrI_#=JQWsFc`2hbQ>+UOQZ)Q9BWT7B6@$0;XJ*2-}d`k0m!l% zwd`?8$ACb_cDJkr%7=b)R7=Ogg1uD9ENA!WXNT^OMHR+w@HYQt1U+*Zm_?t;Ch8lDXek@W^q!KZRCT|5&CU$c4$D^ zcF^V5WP=0E!dnHLUz3SlM>HK`k-;Y`gL?~C@(v6>1zho*ZpOFM%>WZMlf6N!xazR1 zy?xh>HX}MW8$jj*C8kkTmz&}nxNdmT)M?e9r_pbX;$xU`cii|kF%A~ch-r=v6}eXP zEw(55=t(b9u>IOez3&v_gtF2c)YP(jnkBP$^~4SHBElEGJhOSSwxpZC>%Ny2@@moy z2oj=0F}<1*Nb^SHv=jcO-`11`CI6|y0sBQ}g+)Y@soH{%=h)qA=NSTj=lA0#>J7RV zJ}mX-L|msRzR8RRDa5p5`?43Tcc&}ueZc%)12`r_m`<6FU*YSw<~n{(IinF8w~-b0 zu|2$CO{Iir9ZYH<24tXwrYY5-UB^{VA!vJa>CqOZqod7Id zvz}uhpOQ#;1%ou`%Fu1vR{LgyVD?FEPaD>2JCx5fdXRX}$hxTD5sK0LdDbo+sy1L9 zF1-^5%Kgc+r?D=w)U=szD>BtIYD$_XTmEqmWIJZ+0qYr3L~(j~DaEXr2utUCxb8mE zxF=J&(Qjm1^#OO*8Vjo2-L*@vV@Ia%2dsxaSlH|vda~==?;%+Jq@>9cEX}6yB1Omn z*mdyvi5$uYLsER&O+-Y54GtX8Q7P0yHhQ43pR?ej&qnMLou*+|l9L|^(T{B#I>lTa zq%%4!IPF6npxujcQJm4QUxPBl+FY*w{Qu&Ho$l(moQ>Z&sc?ZbgKTGg{pg`aybFFf@FuTem93`BoP_Oq)RMkFNz^0^8C&=!!vwS z)%F7>GKycO;xzWbo4KC^V(@iSq8J{RQIif<@S=Twy*9cgb?#`N6YUJ^7-7yvcFHlx zc@*I923x?*!cKe|`LR4t#28P&i6WYYLR=|8JjxwO-+jbnI~$v zB3Jn_C30xg`bx59XEF4%(Fv}8;28q*pi)UU@?0+yy{N`WnyaBm1xWRciG=08qP851wte$c0C5Caih z!CR(@`Tq1b<6`C%MWs-_{};-vl6Kb9&vO-IMzw)QVu>gnMkZaz>%8~jKjMccgPeK5@3We|z}F z9iZG-NUzONLX0-HD-sa_N5UA?8jD?Yt}-=SCyR+hDGX3hjT9tA40IG-Psi*eJ0{Rg zDGR?(xzgDmnwPu0o}4^bY1RTKuuL;x$Eca|{m66o?^pN>+3=P;Cyn3F0*@^MF^aT} z(Nn(5VW&dmm(vH1`uR;t)$~*>eD*7ePc$rfZM;AYP)9n9?)UcNX@*IM{+ zI=C_SP`t$1f2lbf@(NuN12;2i8d`r=XeX{WRFbz9qNY)s@fCHL-Yafz2rqMbcNWpM zHsgZCn9PqcudtAT^8JSfS(#SAGb#NW zAXyo^bKlg_i~j$1MW5% zP*a#YEwVa72c!Mcf%HooWhr2oyDnt^srQ@CYwL4ddzvuxJ90>~;Hr;YW(;B5F4jPD z?)5xnrNT2Zh=%pgJT4Gk;Ukn#i zIwr$@cI3EtwLRb5JF_a!V$C5hN)m26pmQ_`M@W5OrLYjR9LOi%ekJdRxC<$FY0oT9 zy&U_nGPuhjHaY-Xz}&rTw)G3)gKtn%J?3ZXmQmn;ODsUPpE6L_?jVs7Raf0~I57F` zOlq^U!ag}1{nm0fTvRt5tXg7p$56LQ`D3@kdECW~FQTekOmDkT(-%<1qve^H{*`;} zsh`DFJZJG&>0d{*a(j!&NN^_J1HU)ta3;n{gQ=uf$_%HS1!69h3I z?+XxfjZBaTX0X_jlV5}#Bcn3p{0di49jnhnk<3cp{|6i#Pb0 zdM|t6;c_D(_C96o zr^hpikk>Ed${kA}HYT4jny}oE;`h|7lAj-T4z}OE5^WazyOo`%BxorsV&F?Ltmm5( z@oJ>qFy@`f;?sle#cr|k9bQ+?@k0y}ntL6!ny;Tya+1?W@aEH)5i_O^*5)^-FhaG%0WkUVmUH)Hd6h7h0JU)`0E)?P4{9~`-siPAh%T&Ra)RR-vL*@(RE!{AnZhEfgp1u& zI*RShj|9LiU|&bC0U+3PzOy6OA2d)8w$^x&3v7K=Jfe-l1MXH8*wP=+`>h<6LYxuqbO{%S4F8-Y$~Xn9?v;5 zdRKKnJ#ejecF+EfZFp1lWB|7r;G>x)bkGwf^P?UPO(&SGHp%^}O(< zwu)y_O+{@F-!=j;t(-hT^oa02$jE3U&2Q2vZbVP@@#838?kvyid7Z=C(s#TkW6{M; zqURt&g-0pkuJ4XBM%N0rk2-_M#7YC1-_A>eFaa@V(L061hG7Mm1Y`6U z>_gWCn=5CBL#R$6jqOi{HX-Zv>koP382rnaa^W$z&%5bVfa;VK)>k{}11ZoN9ys%> zyPJ1PLQv{#$y{mk11z>)zdv^iCWc(ljvDp$FR5DS$VIL?7I=aJSMcc-`Y z{A2!i3!9%Iz9pMdQlh6$E78)`>kFk^v7K=b`=jcDVKMRwFEkYDj9tlk?=3j$_aMpwe@|oLg=<*nO!;0droxUoZ2_{0AdFkV#;V3v)alx;oz5* zETvD%^Gz&jxF5~Aptlp2Y;)n^qB=-@pr#uyCdtdE5l80Ym5Z5;I zFG2Vkc0bf785I*-->&udWca*hbr@|4-vPke2gJxVB%+u^^m*7#gZmY;Jxy(GL*iQf zbuNuU24D=HleLLp&M6r=x zg@uo(X*;#SKEvrk4zbs-xa`)y{@#7QLHPz0U&g3@Z`2tc9=ucX)XZOGH$;*cMiT=8 z(K%4sg8b4KJ|bVAz42TaxHc{BRpnFF&K_*)`Yk~61|{0l2MB>og4un*8i{a`M-j>(k8@(#oi^>y>!a8&_HH~?VQN{yr!8hEuoAbMjoKS&9b3C zzgA(nl)@2P9-JHLsW-OvtbR=L5Om@UY-_l*>!x&!@UZJaCS}`L=mFqmQ&zGs@%#Y6 zO>7urpdfCTsEiTl4lfUZssTV{yRw`{a`bZ%#t+1Juu=p3bcXLBJeLDUa6k-;K1WF% zne!{#qpy0LarUZ%Wsjq&MId@#c^>KCe0-aZ#aIo`Fv3Jg$H-*#t`*$)^Gcs7I$CG< zz5%=}faSWUvc^PltVDoh;iM!Q&d1^zc~DT9Q~bE3Lg@<=7mElN^Epi5Kn5t(c9S-Y zkZ>nKm3)!SvA`?5wfm!M?PgDCugp=Ke?ybJ5&1Co?X@r{jtHDQAHjtV^6MVV?o54G zMgL~izs^>YtG-!Jiz(LkiZQwa7+`c%DX{B5 zn{25%B4DEkg&3)K?7j8vdGs28&Gd^>n|4td#ojb?jcOAUw&&CM{BD0eI5CJICHiSuA+x5f*VI$Q%n*JI0|;7%WccfTQJQY1LbGl3A9@P zA5)RAD5_f-WgkIiSKC08!CKCANr^QbgBvmCmyZv2>_IBaeG~sWI=_2hPr>8{S>+_H z^qG>h!X_xh?bVolt0mg={2sF+D$-ADda_ax5W#ePpcBDG1%B7V({gCdRG-wC^7dI0 z$qkygki(V9=W{WGNN2C_(X9e}f}iOXlUYr{S#Db%`HQCf6n^l!=J92dBlW( z{v%A$X;L&4A2Iriw)WrpS4T{5npxJ5;kbVYys3HXAc{Qb|44n=Zl}iK_)RujZwlRj zvnD02pxBCsBNII(sXj{a6`_jdIX<6Eb~h44;ZnsLi@Dv+Gy$%1ypp$1g-T|lFTG>U z_AtByOei{M!|{xBzn9HyOby7Z7o1NZy+VrR9U&sqgX!=DCwP4E4Sg?&%OU|kDb!Kl)a!md9aUkviQQv#gWZ8-en;^Rl3ZZp&Zd%{U z#Mn~=)x1Le$%Un&-KWRM9s|DCqW7df z0hsfFPu~NOV7!@u-fQ5VCn$}2e?6@7m>*S~FnJ(2JT=JouT@JZkM6RC`(fXB)K zbw9AXU+IsqMwRjw9!pzVYehfgl3&ssX%jKL#F(`<%Ygkw{4P*?5C z6i;3Zss&4Q)+1D$8rx5OMwasgbG23x&a2g_Yr9P%yJc44?}SX+YJ?$T zPZ>>j8$|qfCgl0>HYpC%s-64k)htMfURcE)<=t#Q9s2F`psSD4?*#m<;c^x7J4GNH zi-_w&q~|6{v1#qIz15KbHY>rDr0N5itJJLi=Xn5A!)V9b%CSDrne&*;kLLcIlsdas z<4Rzjzkz&??2d}!I+jwA+{5p;)sp1UFbD5Z_G#-`0|1}>2zrQm?g&NxMrv#afmuF? zEE&MW9pAkXmvT<)ap=J)7J#)QOqHq&_ zZJbv~N^0)=)_Y${zTU!{Eyj0-DM$yOr3KvgJUv(xf_5Slfu5;V0!5TB<$pSIe~|VN zq^2^fRK|x8Phr*f-Zi$!O`|7Lr1|%g!j!*SMA`lP=v2$$+=Hxpp62m|bdz1P>m`wV zRt6&dEYTJAOvWirJ=NcIDpW^J+g(y7;l9F)ghw!aAjyA)RYG@O=*R`6D6*XB6JCvk zT$Nu#b99-EU-4banpVHq)S#z2x z{n<%vp>GlYwp|9HGQ*p1n!Xk@Ii;v|r{c**U#=Ruc7UMxW=m^?U;UlD_jwC)Km_wY zZIYy4uj8p?6w^N z?pRuN7q}ASW(^ zsBi|wUVRh>6`4CHr#CLcmr)WA4rFScsQ<;_Y2@=enxJ8wiO~! zIHW(>tSJvJ3F^vR9iP&Y99wj?^5>ag6}oK*^DcM^l$%t9>cI(?XhkyazYFI8@^>YZ zNF4P3L%cPJqSyqu;2W5SEt{xsKE$PjdQBaZUjph6dx5@`qhMEwC zleIdY-E5EWFH%@A`1q88`lfj1O0^2$UT2J z#;UR#X;Q7}3i>oCi_=G-hs&N^Qe5VDBV8s6`_Sk3lWF%?fWxE{el;!(=$&r%W?_W zNi-jPMY4tHRags*p~4U#1m}} zwXE)5k;vN*QH;A2>_x!5w=Ut;TMpnjZ^uNWh1Pd54rCR_c1OyIo#WbFkv_`H6Z zr+%>WL)DAR^3Usviz63WsZ8}cKD+WuB^ zEpZOWvvvHD<)p`{S}RM2VNgu#-W#E=9=a!+>i#|}(Y2_ls@Ytbl%|~)*ijL0ytqij zSMIm*X(t<=LINv7tMy@RXU~oc>oguv3G4bMeqb>=1)m)5GF=G*O6J!hN-pjn8V2@j z#^PEhMQIDDiTlRckbI{`)xrDgqI}F5Q;V;%uJ#2*X=oy1%YZ%)^Ga|+A&mG0oI5o; zJ6lu4MqySmos@gom&dEFTWtLU@8w<98kDyw*Dc*`g853!3XGbnt4sH)ry@TkDUj@R z&3=20_61y?tv!cI?3?dxf8NRz>c&swz_|4FR*ail$9%rxbR{4AnfFBCo$LPlF)5QM z2LauM?~^BIJ%RRD=AAJta35Qrz`@KZpfD;fCMFmQuChfgzCKamNAi)sG+W$b85ejr zQkBdX&l*LdH-s_Un)G4^CCncQri-7xAZ>iTssc+e6nf4`Pu~di2n6(HfnH!31F!>y zTp2-v3NLWlpU?Aw|5&tHpdBSvB}$t6>aYoDGbV0fa9{|zYY;fp8Th;-oZm#sBRhYj z&SwQ^5-~6_ai(ICg&qTV6TMco!%-B1$+L5*AszJStnlPjjkMble;@9~#_Y$qLE@sy zSv{kkv+4Hrv)YZI7@An|_2E*Rz+G%^&pyz3F}e#BrLpfK>?7v%6sFJYa8TR#W(b*@%X$LIAUJ$EE~#s5H_&aK2^NC*dT>h?*^M zu=z9bcoA>0~je- z+)ckb7l&ULvO|%J7x9m&*MLi`On_{X)KLq6^@(PX%wcKt5wEBKx5t(`GNn9GPvZpzSHx)j05{u%lld%Ihw6_0))9H1s=BzxhP8wYqpSY7Q5?@(e0b<| zXZhkh1?Pr8^%=S};PTY_bqW8f_`b|!G%Z>Fsu&?{*aGc*Y8V zQe!~CpuwRYr91OS8T%HWFuRsmIo|YWO%iRPln=bC)X%8&c7TaDL1pHuk z-}QN8ar0`E{?=3J%;aQXNGJIP9DQ?(8UQm(u|NetvtsDtkcRH^9|*vKLV~2~4E3Fo zaoW#v;%ro8#Ds)i6z=eELvV0pY_&Y0yCi0T$I;1L+R$}KRI)0j_O_ZDj2es_9#{3E%xZ4VQF z-K;9*x84q4E*Zkq99Y^7(&P`Pun*C*l=f4P@!x6#EP`wJW-whA#{c|e2oMo%^mdCF zk*2BaiI{KY0*rZjjXc--rCa}3s>b1R#xHR?=DBN4O+5B7m{ecJKexj>y4M|kVIY1n zb>2HANYGQ|+qv2_*;T9}5m__`&D7R<&$oE!IXcc`zsxKK>|!AgNnQ39Yy)<9gtpT} z>I`TO)B}dE6k|Ag9oOvWe}&LZA%L8TvvI=OE7=qk|6HDwx!mwHq_I_wi8yBY9*04b z&G|%oN;f}KEvp=~z8zW>$zwYHr#dvy6(gB*h$q1x6MC}6T!VPzH=yHNCVmbxl4_)a zS1X5P_?6q)(c~|a%3&VA4mf*t(SToe;?n@+rpa^$L}WkX;|tUFr}8Z~Z)e{nbzulR zor%WhX<}nx{jQjIqWfIkJDQUfEDIUvFS2-U^`GHk&|zfOmxB5ASqffcME!uXhz z$MZh}w_YvGBgbvl(_b?<%hoh4PFuHQr2+Pgs21W-WE#IjrfK&Hs}-!v!WkmHDfw=RdJ^@eko!0Pb< zDWK8rr-4<+!`b9K^MD_v^ztmFy5DdVb#$IPpip~~8_nwgpV?GV@vTw_ro-a&%^_V& zJ-DwursE7xLqEP%rfPlykaVC|Vwq+wEkFM=00k)TaIU)KS?j*yorO2A7Yw(0IySZ){xn83ov)XMO`aMDgH`?@aPRx6CLKT>703Ab z4QQB{<|+~2F|vvNsIIE|qVV9mTxk>}fdbI16q;Q3fZtq!o=!CaKwX|+nyR(5>CY_> z?dk@pp3+keVrjE%qD6Hr_dBVyMZbSjq?;@$|C-hv{rxHKh{Px#7(?+x%RN0#mgiHB zxEEk!fcEagDDUahv8}f|@Z{;D(mzr|=vI9VG1M1tTv%AxDe!uJ&~aXI{A@WXOk~Iu z`i5Jte*uc1rmOGr=MHN5Qwc=K*HS@kGl8md~;@!*9MOyK8o9iD=%_!5#sGpnYQ5-6K9_}co{VkEJX<>h9yLUw)+KV8I^_)B^UO9thr}w}CPvAWwyuPrmKluT5E~-_~=Vdz=z+ zC7Z)*-9%<(|2lNFqu7#_2>Yx#R8!Ply+ch)8(L4vO)K9tc6)iw+E(Y_)Y|VjwQfZ9 z6DceuBI1|k`j+40sa|~pHTmPCk=)=#Zoeyo#me*3u3$M+9zJ=#C|l785p?K|fchKuM$kW8$j zTLzcUATE;C=HkB@>@=WN^-aX_(2B|WesAVk%M=Tx!D@a2r)K~va4+MU#Yx0db>tSw zcxY&7>bIENo(+omNak9>hmnEd$@YTg`S}Hyn`sp_Sg3UQd29qPWxbf5zXcJu2gT*H z(fX{?5pK$wdOJ1ZVTlgY6|EFy0ir;QoEz-ko)KZvKU`G+3QpjcIzpAfd!tnV8JdTsV7 zt@jXHm$b?@%lPKbecmK~MDCVpij^vlPM-EN%T3X*$rsl9#HS@>1N08R1@AS7I<;fn zGE&42;hr@m3?d${8+5)LTZTAHh<%dnY)I>hpD|9?caiYAg3Z8TYE>)O1$fr1FrdHq z{PjTSI!552AjgmmuU4Jw4O6TJn<<)IE2&!7rbWdamh2zaW@}C3)85o+nx&e^bJEo= zaIBOuj1cAS`UnD4JbP9RNdGyVo{`ZDkO$2uJOOlcMPg3WTkWi8aj`(vuv)C5DJ2zU z@+R#+nKRs5C+#ectN62}#o%*UCMPb+>uu5cTi zR(irxs98TxGicR)$?={^wEa66esJkX~jf)0F(u*lKWa(S{`%HR9MY^nUsJTcmpKk#}E2d)tKB(-paf_ zQ*WXfCrLuJj8FHTkGaOj*Bn@Zt%)}T>1J2OhZ9Bc2Xffo3_{sTj0vtsNcRVVEbtG? zAN6mXyd#FTR`isf6KUSLn88I>oM@6%vwoD@=lsn+$L4-x#Y)I;LG~6or~jegB$u5A zEd)b=tjY8p8`#I>Y@3fcWR%jzL)g~!4l^hnq>hGDFpC>kr`5zObsg-+ey8d72DD<91`!ijp7+g5)|x!e_$;Xqo1MXmFshlA4~=DP&QBl3 z3ms)}0y%l)_(NX^HeiM|I#Q&%b}zY$(oNG{^J<41X!Ca4ORe6`K+lCrEnVWzh#&S5 z*eZ`4$GM9~I9}ua2!UFDo zABKQ&LgPU1w9bUP=S%(W)ep$>nWO8#?swa$SCdZ!S;PHQAfODTY(EI__A^!JNU*6# z&V^eUuy7Uyc2hc5fRZu@tnRI$X*FrJi(uKyUdnIt%i;E91ptXkvlqDyqP!d}Slc)a zL!mvj#v_=IS4SLQZFVi}d4L2kQyi$|;e<4)1-8NswZCknk|-ZNzMOqp!?zc)4BSDG zH42&z8e}Yx?8OiNJ*w~4JLNp&Wi{>KmU3DiH|A}<)DPvhP4w$1bG(4EdLkM0qHm{X zty0HXN=i52SbYU^($LN1={Pmd0sI+CNtIEvrebIZqD_EfC`A(zqD$5ww;c9?DZM4A z4Y>fiMyvIsu6*MhCen+^)+8bv3e$jPBf6FJy@}4iP8EaOnp?%WPWgy&>UDa1 zb;lQ>*!1}HH74)r;F$g>UNR@R={`S9Pgj0ZRJ^!7;qB9KP_5Ui8cyq#SMO>X+uCV= zhCr$JC(AOC6~daca@_~KGCuW2i{k^oW>n%u=Rep^=0Em;gkO$}lkfK~+Al-9&KOMO zeGNs$`Gx=>^K!`aX|h$X)=D-lywR1u39Y?gDQhi|O=)|5c|0DeOYtF3N1Vu(Orbj@ zSi1`xc$#Z}nW0z}c=~8Q^0CxkRiC5Ur9`KBR-mwLp!=;F{NJtMpD4w#RMiEjFe6xF z22s3d;q2M7J*~L}(lRAWHIpa!&N7aUW;Ci#35Z$P1FY4x>!G=JtiM8y|LxG6O^O7N_9qEUGIo zGY#Q_mGF_H@*SXSqNbslFjJ2&>Dd`c9ijQi%1Z8bP}f_CNvp)Fw`WW=xj_e2m=UIu ze1{3}EGmgRfY~$S3)c86CEZ`BHdmri4gInmCs#y`d6NFE4{xy`Dg`D5g3HSQnCc|- zW{sUm+qPtnFWpXYT{j)+)|Pk8?^Fl;4PX>fys=rS_f%#|qlL^dQ3+)U&8b;SzfyHD zM|3Y1-xv@Xzr@?5E#WALxr&PmJE1zKh~Vk!$dh&#E3BSW@X$2#^MgL=W_EiA#ExiS>}2t}-csxFVa@S)9$TSOKmT@B1ld1YLc}e3VEUC)yM=FcxW$$A z6BX-5_9|#{2n#B-4Ep0VJin%at9b;EQ*qx)AQOFm4IJ;VEslS14w zeVnPRC-!na^<5>^wWWhCze%Sbe>u6R!opT1ljlu7!C5o!oR!z)kOO6 zl=HRb_rqCjD`Gk>n{Y0-4HAn9(=>Vs_Rn}3Sm0WTRXTptKF4zuNy4=5y@Y4SXxLYI zUA9xRm?aDT%^HCwqkB4|(KuDV6N&er&+!(rC(+yseps|BnGZqj$Z$O5u^*siWuSM) zGR8hcLg;XP08&w5U2@tA&!X(lPWM2L!u&o$Yy?P()6|klX-VAn$P94yNZs~ss03f1 zSRIns%rT~*zvA}i=kVDqbCnU?V4SYD5+HG#rHnLZgUE!yXdp5PAFy38Bx>r$@=3d` z#*>m#?&l4!{O_k%cf*Amt2s&PE!6f;57}+ugN8QQ6zb8Ex#iFzXGmM9Uy@kjP$t)L z{r1)EO1esw57?S2AXBjRLC~PD?J1guH=#bPx{8h5w~gu%1(n&*d> zpN!-))lv{BPRv?8QsghmD?mzLAN{FWuiXoXyLY>!0%0d9IR8&E}n=t}9Vsf0$ctTew!S#uCt7Ff1 z4(uMsC?_@0#Ot`8n%n$zP&RQ#-xDe3GM)xhJzUsP49@SBEcyJ&@Q~6m-T^;OdplNbc8b7KO zpm9mYho}xhL)Uky1f$r^?z$20~@W-mf zuV5=&)G3KDQJDX~&Kp<`IB!9__WN$7KL`5*bhd*N_+M#_jB zOLqlyqg5CQzDnC-;Mzv>h~4f$P|1qI``?5aOT z;iVJNro%Wd24W#brI5+3fXQ|hB=NjL|EMGPiw8Srt7m=5ww;J3XJO^;&V^9|1~4jc`wR!Z4CwBs?X8Ry3KUKPsAM#J&*6Lpz?bLBppSvKFU=JIt2D&y}IXoe7 zDt^CTM+iR*HDgZeJ~GSw;N`X)=OT^jkDT3_ot!>CW2a^BPAxDa zo+OTxKL%WDu>Wa7M`RsKay`Ye46^-)+y&5#0hQFy;2;kmWN+*O2s3^r=ife~Sx9aWTo;d!z2d>_ z+Y@QE54(b|jRxJY5)&-7Z$)w82|rk5j2rj^fba5U2P=2|MRaEQD6-{3AtodF@M5~b zR`>-t$NboklnEzj?tbey9?0vh&s!R$64Z$9{WS`GyuCGIH83TGJRaA5;;Q*ZncOc! zEbkzsuhAHjAxi{l!zp;`8#S&l)YVb9l2xcu5G8;~b?&GC zW~}?tDu-UW{cYzq3G`1{_Ike>NJ;gn9_;%^(&w}b*^Cwrh49bN5Mlv5d=LX@C6*f0>8x=-@l* zm_NS`3X2;R7X*2PbInbC@PjPPLdT}SQTHxO&Nm1POtj4@&sCC8O<}%wMxgxw{01?8 zhxP042&A8wPL>*q8%HgwJ-xO&R&(ONYsP%xB9Ar*O^%zDE1sY_K=vLa*^r(AzCat5 z)HUEc-puWPzYqxvJ@4g2y)X7>KEh)e1G|` zJz%M{6HG%HvxXB92;QJ(OEdgL;Dou+g6PrkPrKe3W-ZWha3p~3^yoj=!=D=@=F|NI2~(&moqDaOmH28t z!^vxGGLX$y*-QroqOgEaZS`(?CpM3-RlMo7TMo?v zdiK6{W2}!e{Oc1SBO%cBQN+h+)*Fg@XM$E_6TAMFO*9 zrK~G;VFrtcqZaPXFeob^YvOy&ykpJx!C2I>wTiPJ@t5d$jQQ{b{xG1=f1f=id(9je zOLs!=mSYBz+iDKZIgTthmF3=!j*u9+5MIUmhx3>Vf1&O7LeN~_Gk*Qt;k+f__MUGn zM@_pJG@qi}PCERObf5eUK7=Z(z4oZ%yuuV(qgT*Xy3~H#;_0CH<$Aoa=$o65Z&oxudfL_(ZrNO}Jtn$AGV^n*~e2c9(; z1#mf?8#p(m%7f?TjjWfj1Z z$Eh;4lYI(=0^v=36U9(sx2R<@mW3g>VRtV20R5f_vQ;-DJzbWbdNRW(^MU+|sJy4A zM~EPn?>{!<*AJgDOm^N}=L3o~^kDED9u%7Fx~0Spz)5$6V_g2!nIv6H;w&i}X)3FG z3LSpQ!Bor**thvgW*0hd_mv-OG64;Y1&OA=+2Q*`;^MzIzA(8E@p@(!;#8nhe)o>U zABD2tFVXV!d@Jo=L=8Af*3vrqx3UA2&NL$@35f9o{w|r@mmPD8Ri85^Y< ztLZqF*3Oh`<_9A`_WHiXTyH-4zhAz-7xECIl8+&)D=&MfV-VEP9+iBI8I%^eXEQJIGK>|dO z4f_8W&;R@a7hwJ8G2_5xt|fNH2KK+Yj+-1G%L(FGF~SwvsJe|LlOfi=9!l%Vw#t?s zrcQG*P_?Q#Fy#*^*cJ*d+qt|>JX=R{aF65~3pr*|7_~p~Q6wvjPx4Q#REVrMhe9=5 z%g{FGh%7uTmN~vAF?T1r=@@j==2}P{L|-LcQP@{?@0-()bc1KYfraQ z7f_}6^nXU)U+5i~5OhPB&vBp)k(2v3X}`%8FPkFK!ZSCEBG1R~he5CY-(i*#v8k~b zJaIJohI@?9=R=65xjKK^^`6niWy@a7MW}`sS`|I%Z#|Yey>66TVB@BGnPeAN7R>9Y zF8ixiPNXCi+~~iQuniEZ$<~XM{uD&` z(ca}U1JzsmA>b+uf3UGF6I)h7i<>Dr1m^1p#5yO{-u7&`IB zy&)9_jj+oxWQ7d>bYcD-EYQ<$x)9(-OwCf&LOTzuM_%1ODMPDdQ|ZFD_0AxMH1v*3 z=~-Nyxu3MPDOy#q8HwppLH*dU_GX^v97~+96G=HLj6nkBLWvXo>lMv6HV!0%t!N*UFb%asO>!S&dzLL9k-8-@ltzjn`)Q^pC?5?vtc!6@lr-qB1meVplGlhZ zPkbgss+t<{b=M>;$r)#8YlSVTr3jj`9Q>yKI%<59UF$bqTyzLc7%swhFVRRei%c}{ zfJ73?{-?i5TLd?(*g*I=Zwy^80bW%#gn*KgQnM82-uDazW!Q|_UDAlzpoJCR!@>^_ zue#jQ=6j)XNM78J3y?u!k7(V_BT)`&xE{IwHCR`*@*h>_7iDoNEM**yd& zo?q{n9<4m3BL?>;&Doano*DbhehN~*87&>_4y(xLIJjZjq}m#@fdkQEjR@7;R*ySu z*AQ1=-tf{>7kL1YFgX|0$)Diqg#R-FU|%IT$Ub2qM;7B2KbQ(%Cpk#^%Iv?HY<#7c>qQ?KUU0`37_v>-e4i$P9 z#8hBXJFGUnZU~y2Ar%-n;#L!5w|xU$^7eH*ZvUf1_H8ZioEoZo9oNr&=GE(uGM}bD zSLm%GP~6+)A}`TvAR7{-6ALhmpkdpFH!;{pYnZObDucbDMNB%{GKHR4n`f*nZz#9w z+sI*$>g_T9*L?oRibh8P-uzx&{5OT7F4=`f-hmyusLRnJ_Q$`^p}hoAk7-eL#MgB6 zWYHw-k;m8Z(Hr$bv1Hns=3DGJajXe)jTXJX=}rhHC$#li!yCC%Y+C+OnN8yW)WQ_5CQUNyuo6HvzUS1E$A>uVK+)>XM1 z^77aP;1~qL2Box)eB-nPE7?FQa739!*+KAU;Tmz$nsInSG1O^_pJ2j*@|AJBo)rsg z$HmuHQ+`DpXnwbTWEUYotsgj=9xE7Mxt5)hed^4Fpqa6b9}5W=L{R(wf4m&9OhWiT zKrneHHoVeZD|xGhAHAo(Z+C2MDYnU4a5CQ}f{nSxU@yf+DSPNn6)3?`mvQ?tjZU=b zsNuE}a+&sH4}p9AhncvHNQlp;{ND5SKZ-lEhkX<#1yMvW%Q~>j^Rx5QvppE_ApfTx zkF;+Qc6;j(`wftAoQ(ha7CvZaVm{!C4^-$Harl^txnWMl@iw)zYM232#mvZ$H^vyr z8J;7UGLzEM9xL%mw$u3KeAXzdWG$QP7lV19xl26;ddxrm-EPBRm&7CtQJ$H%+YKaP z)I7gG7&MH5&tk*SV}y3q2q z-bZYF7dZ)?(2$5_eO=OV~%8mJ8oJej{y%v*HI2%UWu7}Y=gw7niF=64>uyv1wV zERI+E8QEFmMjV4PYBm4&zMs%I=m5pD=AJyid5L4K zZecmZWQD{&5HI@+ZQMpnk5!!Nhjdz{hXx%i3Rm~b z`wfag|M&duipYfoE8MDJaLXQ=TT7_fSj9p!=>qj8I2)M)MQ4{$IX(65)44+G$$7A9 zOU%s>Vx{yZ-Nz?c5T4ipl}s13%M+gR z^2hZy?l;cw|GHjPl7+RZuglavjt-Ro1SJ^%`pJKUeQqFzglP=FYIC?-+bb!GJichP z)WF0kbBlKP{w0Ay+Az$uUYQRmfxAEb<2J*a#Tmy`vdqnFoLRx3-5DT>5Ws#hbbZq; zsVR;001*kYv9kFvtYLoK{HfY#^ZbK1SL_iEbdgrdON;fuMBS|W_n?gArHp;F&rrni z><=xFy9V0Z9=cw38sbI)Q-8%yiU(Yk<|hZzi&{I$ri7tTY~(G({}IVSkga0_You!s z@@H_xQKjDI`Q9w`?_^C|6jE{lPXZWUpeC>VS6FxS*F3*Ez$NoO7Lo3ZEif(WGT(_P zphnF0Wx_Kz{Xjidr`5?Fb{PNj%GXf-={J;4AOpxL^*9iDt<<(qh3i-Sk+ybHO#Z7i ziTfWU7rB`e;a1qcJ-a>lMy4oDLjE%k-G^!zRw`~-=U584 zyNPiFOS0HGJM$fs74ukB)Q7TGu5kK&UM@5r+ezwgg-C~CHIaplGIttn;!>9CqV@-3 z?LSDkaIbCk2CJLTVTbgNgoIqaLj;4~^Ow)J&F{_!Nf96k?1~s?OHd3+EkyqHFi9gI zTzzuSLz0?lb3YE?{;eZase^l^4REK4P~-P0NI#pQ?Ab-%DX~cMmov04 zZuNa(XWUDRWwOeC8;iYN&B-RXA$lM4Z1`v@jsy z{^eM5X@^aVFEW~VY+=CucV5GT2${Qd%n0n8e05U+DuAT9rUqqarPb z4>Z;#%{E)v_^FPvZtafLyypJP$)pqh3>mKbooa72) z^AX%Fb3K!TTaC3>Or_PaWz?6iC`MUCZs1(J$ri}kSZZAMy z@i;Dwp5z7UI`WvVZkl45(H`@A2eRQKt{T<}zp`2y zfl{VJQWk}}t?~K)%mUzLtd)!OWeMtzuy(>ub6sz@DLFuUM6Tc6lg_xBcX_&RI-K$O zrq3SBvHNr^x?EaHr)mXu2BpQNMPu6XX-@>&ci|tV%`cpoceJ5py8YX(N0I{x*A{M| z0;*dCtTzTirI{ktS&v*)&e`}?(0O`}{5I7#&Kyp)*2aB0X2uYfmi7$`g8hfIW0kRz zq&v8eLG2zcsh>*SJ=XVijSD`Cprhe4=bh13Z~XW~-OcyDHxPZ}X*AM_z~uGe{gp=a z;{Tb}|5QSLLepVnXzuPI)%irOe>Pq*?)QZWIz>Dm`_c$Bw-odT9~EzRI*n#C99ITe zchgttmJ*R>ZXuxEDv)n|@nMY+F;)qEyNtw(9C z?9p8;9z%mrt-YF?_L^kYIBPYw9b`G^;V5It{$YoF(AI$-*^c~`KPb|w@!PYr;B4Zl zS!uiTSP{q4x&J`hPG2x^RaLdl&o=+&N?kE$ZW4h{l=+ql=O^_yR#rdzf5}=%zgvm) zS!ylKm9?&>(&qJ@eH7Cx8ZT9m=E4OH7+nH$cwE2`@sU0i= zG-m{9$!5?fs}s||c7M$OV))MmMgsvw6ChvM>#8Ih{nkcqTCl1wpL$ilgY=25HUop= zxyfm|77dNZmwV%<4Q@)ad|v3>sV-p=w> zAtRjYwb2W6jl|U^yptM$Q4P8;cBNzgf1j)I<3}Ll7lP4!-lwadR>fTlYiZPy;$ALD zPsQODo2|cJ{+RB>4+M|K3so(x0?H1j5JfR zkSceF`t03$vFW^>PaM^^fA0=`G$5d6E(mZ`tSjn<) z1o$jjn_I`1D~?qd++R|D`u7)Jf7{N4HvFa7o1y5o;T5~L9Cb=EEnGSJiDX`Ia{(YL zd7LMDq#%^ak8Ik(=w{ZIk3)SKd8Kz(rJkvOQDr#(Ur)OJQykb(s2*30`IZI)C#W~J z)>Y8!qDJR^>m6Mybt0Trf1{6*e(tOy>W>>Sln>}&(lVQNS;z&k*r8w%l5$I|5 z(0$f6c>0?>78lF|_G~{snxmv6CJ4!-OU1X6HI>B5tlRJrq9bmc%5`YgL6KAtwHBfk zuR(@mQ^KJ7*I@*MAg=-HcX50?Q?)qeM|^9J&rgvfBL3{*H9uUR6n|phb{nl_eRCD= zvZTEG}@}+%c;D+AhqdthAZIWH|8-B9rtTvcLz zHwU1Ps#?rWP7amwIB9peGa|%AON-Es>p9?W?`dsqZET#oV0BX@XriX7nh+hGIU(hF z+JSYxl=RGZlU6dd@9(Og+0d}nZpvq@E+Z{1EfjcAOrqOvI+mWD{hpfYTX!v}kVQBO+k#`tYP7@cYET|OuHDMoM-y!|Y`cu-8 z9mA_*EwA_W{BNY*RaEI8aNjK9Y|-HiN&u7~6(9zpVL9RaE1sHSiNysy|5shvRbTc5 z4c?#$dk1_aEu|r_e*uMDORiXrU33G(bzcrNHS>o8*ro2LC_ag-D~m!nY%W@smzJ0J z_ng~50h7!xDa==J z)6>)Xr4*c;w`umH=YzhT+1}6BY9)(nUXRD=s)Ib8)Ow!R*e*2bx3uRvonO#FWB8BvA9X4$NMNg-G|oEJj} zz9|gK_kKsqPXFm#rcqaglb~v9Q?8!@>ulAE!Mu)GA}iY_SIt#9^gAyJ@3|QsZ@^s| zjp^&t3{!OHAf>=~rT$hirk_NP1Ko14cE?;yvFA*XE_#HJw(?bQ!5(SexCX~C5-tKW zK?1Y>ABW|@mAeU1Xs+O085vnT==Gnxzz?}r>hYl z==XEIYC1X*G+>fYCV$Tvzb}Tl5XzWeuUjrhFSk1&;Gl7RA)<$ehAtOTnf+-t-@W_t za52OrCnpE@Qr>!#qGq5#8GKt|aQw}6;|8BuzXKq?XMu6l0Lu+5{_yay-Bk1y88jEr zfa1pD&qp)*xWa0sn0eXhMlpM@UOa$FwdEJyXpnKY|83*cU5_nEVeRK$nwU{D`A~tm z^RfnEtJZNNbrP}$wqtPzrTh+)L466vQQ|L`9?!1F?>9zSL~EG9MC?=nPaa!3TJ7is z=WjCmvw0~oECcU;D;-6E)0O^KZE-Af9s~Uycmfkxq;(7WMg(yii)H`8hxl~1hH5Ky zp5+r|S1&d>kq#)xryPj}n&Ln>mw{Nyv-S;)&L%J-M$??G=e0@$%QwV$KvM8d#8rdt zZt$)hxXh+0^tSKBt<6u|{yjqrV!{O=oOke56tq zGt=v#-s`3@*1B#R!0`vLZ^*wvi#s40#+EY?g}o9fehDApgO2Ro>K+q z)ZTCUbWM}n$Wtg8Ma*J&B^T-WPF&}$<#!dk7g|PIUS8{uzq(HTh*|H%Uu19Ud4cbXwuN;IZ zgth)r;usqJCg=MY#6Tp3EVVkOv@lS*0=dIe)ksGPCjECmh@3ZI6CRW5ZV}#U^5B*C zg3w(nbyi;=dH)$pEYpu8Es;+_$`j9L_;+V0b|`!SBwV0p_V_->aA1xz5PP7#hsb^e z=qs?LIvyjJ+-9eZZ_3+@o)-A`I_IKkdQL6CNM|&MKQ)>Sc4S`9mjdYb14CUP7sPC> z0QRnrW@CW(h^8b)X>@EXk$guDR@PP`8|^9#O@lG&m*l+6Ad^DJXEvj#JH@~ZZI_{H zB+1+T{CeQh>~qj{ZOgaz<~GgL*enPhqfy}xqj@~Li?&!hcYU>Mc(!hzwb0IJ1$jED z)YVZC^e@)Uzi`r5`Jl=re+N%Z$U$hh^P%W2wen~0oV$dZY!!)Jwmnk z7r#44w3v$^*V)@tzc*4{#9-_Ku;IZFM!Heh8Qnoken(y1NHvwi*)Db*~^-`_50s`n9!cO`^orgKV0*pgR8|4pzz8M3x^EK z@9|Z!Dv+~5rtERvz~v=8VTW!i5GQZSKac&eHeH2*_pSU|zAO(-y#bVU^xyExVTRnJ zGzDB$6JyFp1VeZWbGFWdsBWsBWxRRkTzXskEQzld{lqA5`m37HettBiX@>U1meI?` zTn3GZ5`NrVH4wMMeWRhWdqJ~=6llY$^VqZJ=OW0enEKo~<`m&we@g0I zl8NkYN%UU!&{7@^3C#Kt36IRWBiEFT<`6FAOGN~NvB!^`BTk9n+U#4fxW23S`SP#! z`NhQ-cbCVD0ei(SCdruai-87lAFXlov=*@#eh&f(RR&53I;fM(r!{3h3R7EacJRQUK)&a9zib~sNQFb1c*yFZbO!oVCDwQ z=D$P7JGBOA@xYxe;&fJ8*tzt?0v=rIc&BJq8KtoqPK)Mz=9uk=8sJC>zvo4-mkwq- zq^+j(m28RB2{`ZBj3u3M-|zYoK9vcbN^Ay-KAH_pzBU`reR+%VT_&0;-5;_9Rg6m z9Xl)oCGhlk(71wUV%OOyl#ClqH`wdz3kYY1KbYNHw(BpBf-JzkWuiii!UsIa1-r76 z>z7cxua0(c3b`+HxY0-oZNg?{OzV6iA zTlBp#MWu+SHh$`h=k^}vM*@>DuKm0VW4OqC3!?+aGUTD;j{|6+d=Tgzi8~CB($ihv zEsUlw@f}Yy%t@h|u4}LD*lFu6F~_r;#HB3Xjp4|Bn_c#0|h0_1mHy-60KzVyy_>`S&Y62*)vF8GHne^y>?@ zqSl|O{Moz5ev%+Y$&_1w-KK*U-wI5h znf&mbXczCC6YVUy_D(oMQ0h1L*^xykbCqMR}Xxoj0EwplAkUGe(zyT#XjhS ze@V2R|0!b9t={7c=h7KTNuQ(jVeu@hZ!s-tYrv@cnLEbIUkHre5jh1%;xRtw!)h{| z1V}Id9d_7M2&p|Vv(T@OOo5eSbREOok$dKR#?OJjOFKY|@D&)7dCsiK=Ffx$Ux_Q~ z(|rc;n{g*2bDZ=ppq9v%Qadp#)|;!m_kAi@>?2FC%0jrzdc3WCHoi8eh(qH# zv**~yP% z{R%dw7+mk@u4WntE5s&#q9cpa0xxQ`d2oZ=&$OVWAHkg$w6C7$>91I}_PlA733)8J z`|U%h{q~?13)y%=-=QkFTuYfH%>$|rCRedUuY{io0wHf@)15TSZ^Y9^s|*sCj3@WG z!T$l0BO$!j5V=2;o5JAGA_ex1=EFd)dr8MoFb3Fg66$wzQDjR9TXlS0uls={OSqnH za5vJC`wdKTits7Q-$oZle(;X=YWo9?ovQ+*K|yws3Khi7$ssrmaAfM!@Qg8KjY?qV zwE8{dX`Rhtl1C%FL#SMISaElYnHc<`pjUZwwqWaowNLJ(4ihMM5ym{e$<^ z4gTt%s7`#5Qlm}1RU3ZvSNBi>-iF=)wFH~Kzqmc+cHo75!<3*r3q*#d3e-DLiu)(v z2McN!-7h5D6kB>TC;3*rwQD9QR%pD`D@f4p93;Mbn;T5%5ZXA<^OhAXzUB%WMUN4V z6SZ-i8As7SQ5(sihwVKPh_EFoWy#mR_I*>UpX@IKr-B=mX+QkFP0!@2yd5rI&8pwf zohal!=V=dxhxu)-UMNpRknMk={8kY`2X(2-TZN(%x6;L4Ifjg5I3en6w2-u%1zc=~ zF?BJ(Mh30xS~+YxfOI>7=>*C@@8Fgtrn$LLr=T5R#55h$9FpVWx-Gf9&#oQ&DESdR z=n8jBeJpSVH;5I+>h!PIJT8%Ug7v^1{Ysfr7XKet=Nz3^)OGvVw$aA6*{F?er?H(j zcH_pjZQHhO+fMH3ckdndeeb^+<&hvd`XYuQlgymeGeE@Q9T?vaNK83#XV7#OHZF zVC#Xk5$U1RQGu}Y8DL872mUce1+zQ(QiDz5+mD(Ay2%s{rq}5P5Gj{$K#9R1#eKRp z?O774h>X*M_wGH+qj6+ccZ4swv@E;*Aisc4=j#>F#3VX~_;?E#>)ileq`wU=P}HdU zdLW9PjsF_qtHi>Gv_O+Fn)3lS($<`NG=lHU0=S{S8L1V>4%UD|T7850!oTMBruJvd zmjvqm$~-KSdP&7kh@vutU}EHgwZd?*U?4ZSrHH$EP%b}K5aNe86&Pv5_7;NrN)W%d zio{VZNj)rZl7V3CjB{@Od^fVJU`#A#gyeb+1aaNpCc(9;3Xno^O-4>;mx$aH1Q25x zuffCsf^!O=2|Z(8BS{*^dK!W`lM4dV_~((>hbcyZY&u*gb4Q!{;aU1AxJ`(tUQceS zP`kPx!xQ*4tZiVq(0B1bDY^b8X(31~{?k%Uk8MM4pYu0}Cpt8IIJ=X`>Lt3rr{8fD z;k}5CCgffd$WxNKmKam1k>DP9jj2MyjZs7_X!#(kSft^i!L}NUL@8({iG;wm@w@zW z+uZEM#i8J7yA&ZO!yyljfB5iQx=p^>-=@e?>x*;o{lHoAVSzUQ*&NWBrc#IOVlY-P zR@1K8jI|QWqJ1e8fCYpjC`|6hTW)iFY%nBq;uAtoNczD&+mEh=eM-Z)Y+SejIo-nJ zVAUv>C-ETo^)HaSri4~yGOS{$X5e;qLK2##L?*q_P=d!&Fab!Qd$a;T&eO7+@LLs@ zc)nk~;VOL#SSILnAg@#(TvxRE@1Ik!5FIWeifg+DP@_lv9G2-(9K?OD+dbaz7i%TkjJ!<_(ew{IOxTj5df?RY zKq%;h5ZI;BNY}VRRmnm|^Q98uXpMjK2FegXH`LsE1;%@gF2P!@-}~z^7eyGuzfJhQ zTdlWXB7^x}xB-c8mH4%!;r<1izfb9Z!UrQ0wA$^vVW{`9xR}GX?++0N?Yk$N7rjmN zD+%pE9Q?%j3a3V{-dmw0l83`eqq&ON{Vj3ZAGq>e{lZ$$f*n2mZ%hOb&iQBnUu|%R2DVlTE{7X)XVz zjRlQv0zC16%F_yrGP?>by8)ox(3T3jFklgS0-yB-f$x_;*!U)w;D=ZwtzI`b3N9%| z+M1KGulEwF6nKgK8CjcN{j5O|ZDf`uN2+Dgp+_pvqtH_ouAvVruF0&ha|_$rxNK6d<6Wtd3-wzg~C@YVKH6rcV|^_J%&|C8axbb z>`}X-0KQxm{bR1=<8{|fF>*k0ZzIh%C=B&9fyQyDsp3G$s{vBaF5yT!YYZp8rJ`BE|{yD!ts zZ||F7N-F(F_6djt8;0QbFUeRA#@okCBQz}ZO|#4aV@pO5I#Q>z`L3w2Lp7YE1Y(AT zoUhn;YqnC!xv@B;Q>cK~$Q7c!%JOx4yGP=oyk7xXZ-My3>rMN$)kwK86Q2|s^|Vsgo2CR#JPwYnFXH#8znY^-hX`iJOuz}!`a;v<6DYT>UM za(*o4XooqSp{4AXZwD5R9#hrw0yL_stE-N&2jSfb6RY*sdO(}G*r6c-c4DmwGZ>%y z!x>OA<5y?d{oR3A6ZNt8K|DoAt!;B0i$2`xfi3OH*P2o$lAssnb5nDGTUr`(<6WEh z1{U6sb7aZg?kqZBcb;4R*}^Q3T-8HR3B%_tFiDK$%0H9U1&va7a0Gg&L_!4GJd(6Y z1fjV1@Uz1y`G+|FubQzSmO_$tecw5~CA{-u|HTP|w~n zA^s6bQb#6<_^ue}A17qL>9&igw+?WEdc)u0IQ?$UH0ao{t+xf=UN=9Ha>7_Rp!|d3 zdG`WvOFFwM z>tVX@tJwBpGY)4TVij;tp9(^>O?J_<@cc&aFwebLj;IK@i9;n3c6?7Q)f{`~98Zl< z1rZ8Y@Uw}kfW^Rx5v+Uf%ZYA;xf3jeN&dkufqtTRdI58|%mXf1#Qo6uYGbXJoxZrMGU_Cx>|(K2xA<_1LgBhc5!!(MNoH7S zSagvBiyk$`4_YJ zMdHg5v?aXkPFNR{ug^yHI1U69nKi(p0A)XOGT4=oTOJ9mDpxa^L=i_%?vX}N7y+_l zAyq$_jYUho?qE+s(h~mpV?reL_QekyL%{pkW;^syYowa%UvQW~w;y+cScYSG|Jy^y zM9L1hfp(t>eB$?~awM#(DzH|+_uc-7{KJET-wz@Apih`tOsqO(H~N%Jywq?#SI%Ec zaCtX0k~k*@#SO1YN@x_o?7n~VvBr~VBa$Mz;KrIq0b7q0YAki@U5?WLf6>L2anY3`k2MG9{ka zItqjvP@~`+0ug)9z8k>640BwP9f5HelQcuk9PdJ^eg)$=vhg>Ap{%+Nb+;Du-r_{T zBU{#0fiqx>7DQ1+(TB3D>Mix27Q;5+hwN}Aa6(W;xa84=p%OXbU68Nh1I2>g>)zDI zar5235rgK##v=5|CjHmP6u~)VX$mk8;Q+~XJfMAOwQfC)%n9)A_F}S>hOYIY@L=SZ zK#m3DY6^%-Jm)iwexAx4?m9s^Lo^bHAwq!aBm&UoO;*b+WvN--1Ifu`ezhb)zCy>p zK7osL4UnF~LMDMN+C!bbdf7pXC&B#V z@gNrUOHe(p(|VPWH`OxU=CLE8MMbGH2t09fAM&jS#8$!ssUyLT3C(cwiQd4#&VlD6 zfL-|l7iOr=Koq1&+ooJHkV<^JFZ~<<G`v5C|%cS4LhGS;vO1XL@E^$^ zzl#8er0#Zj(R@fGyCOVx(fR2GBf=d1M@UHld3P`hd*0~^Ey-sdAei2LsSRSRB!mE< z&Rs_Y#Hh96xQ9f$bjCo#mL{1ZYhMs*h4mp0M0__J8|&)4cxZ-rp{*F58&p zE%09$q57yg|bv9Q0> zh+Am@VnI5l8H)+qWBZ#o6-X3=mwk5x0vG~rLwK0#Qhj6u$e2}CA2^dew(7{IwIs3( zFp0Gh{x@3a+DP}eS+0R3Hk|?~_0h%d@mE4x1Hr&1z!~p$L+0dB&<`+B4^^dbG&8H! zKdqVBhtexHuVqu$+RYi$y$5v$+zIr34!g92wsz4#A{mP`%94uXPh;!lWoqu_>JSIz z7^7bIlhVu0hPvVXCRW!Yv1Wg_MhVT7kDBvE7Ry_iWk|O)1Rv2DGK1O~?4fpdZ z5Q7lkv)lLDu1XDk`ySuS~^mt!u2wI34ZhL*TDP` zMhSlx@JmjJVml4Gv%mQ7Rc~)*)SB$sAN}m0o}bfhJU;N!QNOsZx75GcURiKh^652+ zcdPwEwkyAN$bw{Y6sP_rqG$i1O)>=rmMUyH4QGjki;G*vU06Am9wzA)!QAZOq;Y6&XaIWy3r z?$11-e?ub_zaA)Lue2_f+F|arq9@RFAAFsdC-$mAk!arQz25Lsrx!JF^u17Lbb!LR zAjODDSbcP};q669BzfiH?e&A*l*~APkf@Pgz|*F8eqlkRwKQ5$_E=Tl{NRDG^TMX$ z)$+6YoMC^$4bq}FotffZ7)F!`>?y<0zBwGL=MYMQoD1I!p~u@U3pEqXWyz052%&RA zSQXW4tYdfT4M^O50?4ponU`a~`cr+nZ*(HF>R}Gr?iaMSfA53k^Z?Mh!0(z*Ud^_+ zahQyDl%juol%OTp46AVc!CJ-D-QY#am- zoo=tHon6k96lRZYk-HVvO3}})iYY9MTS>M-!7pY*AM4pfYdE8vPsjbu%zqeELG|(J zEbtzXKj99Xw*#?XLceakEBT@v=|Z4boDA?_37}rd!CyXU55NbFZe$a%8a~j^w71M0 z>7sTGj^E>BTbq@Q%%lnux+>%-oV?*QO?bUsOWgS*>v@dtQoEnes*zKj(&KjsT3NTy zdhfAQx=*g8R_#y3YFxa8#t33E)VC0NpYlG`q@hPPILKX`+_FI>gbGhCpt{AoMPh+{9 zD^oK{j(&Q7o$O!MoRJ)9!~csodKTLU<4Y6;(m~<(D&wd3Oji{v62LfBP(a~Xl7G8C%g3pjg4q6q)19_cg_EGP>}h}vPV-9IpeDg{TQm*e<{zK3r_4umt~bcX$s(uRI+j zhY7BEJG=waM*gW4`Q;f8@9j`1sZ(2ejM1nB_Lg&o;M{2w4f%$|#a&aG7-pJbl>TK~ z702DNdH4gBi+73ZpihkSCB#5X39O=^cuj@BIF}Ka4Jrg5We56>sr5ZJ&z(A@>75FA z(KtGQH#0X^$>}$tVq$9C$Z&|jG1aV01tKkG6ao+b4^y_&yT=2h$w;0I3dB;%C~WD8 zIf?EkQ_4r87ze(E(bK-gMHLv=tX*)-y64i9o!Uf?n$l}GU6e}1eYKHBgJ;heGSaDC zRG3JBXM_4GhWJFeM5k@Rvdoy`g!O8iyUXvPdu4(4ikLZw8j`Y=iBrA#-NUXhYeHbx zLsppXi_-`aw##bEcBY>aO+O0xcJeoINxBJx6d1GaNNl}Z>+1S(-PWq1l|L0o>Ueqt z-04yatyW7}qYU&F59b|c_4OSmwJCm z2Kc3(`ggXZxCa;ORW)dyVOPqt%n?H2t(!M6hzlds!=AVef3!S0&|IKq`<{_LZ)>bb z(Q`2V+h4vtnmSpEQg8XdrT+w>ihrBl0JosEqd*b1l=nHmhTCPiw2<-ruJ#%`Qtn1% zQO@RMU$O(y-CSDbzXiCy|J>4D%<#2Xu`}+IGN*|~k*!?KkIv1IXb@3{3SA9ffFYC0 zLV`o9805~0gRNzm3vq6w)lB0aLZB^H^$m96-hGtJ!S^J#CG2GzDVzF{vS}8-P^om) z*PW{3Whh5ggP5`7!rFJElUgv$bH0Lq+bQDqdRtA2FPSXWZX^ql9%H9Z52ofP?F;Hu6l-!O@H2B zmxdGLe^@&Q-J@Hxg)A|aMzP?aho8&p3#_>szgB2o?{7BJRhU~(nuR9zp06xwhtc<) z-Q>A)sye2rRcJifTwnLr$+h5b1xn*1RjHv-{+Gt|DiVYl^s-4*zFfG{`=yRmD>YTd zXx*2eq^i+bP=}Kt zE9QLdhh2>^+g$WdNgQ`R5xI}|{EN+hb*99U66|MhEFV8V#ZCpRvzR%<%XRL}zOUBg z7*Q4+!tQq)*f|j)=?jt1;C$gPsJtpaeMRWxG4ff+!Y-jd3mw^x@~J~)q+7n->6ZCA z_CpRKIUF5-U#_sO;^Bf&DwVFh;&=VLiM!Vrx0$6q56Xm(7@;kKx^EU#0P9+-D4U{JIVy|fNs;> zkwL5^KPkBu8T#Q@^X+x;fsMa{Yk4zQWGZb2%E7awX3i_k{%x@?KdH6rEih|rzU+Rv zc|s=QONyeUF^ixK>@DNrK<5g67v;mb*|@zYWFIg z;yC9?O=DK_qWBZ2WF1~CjI zTk1bG-!1EjyK3-eOCIX$DQF2uO;P5T3S|D@@mmk0#|$Z8gmbvbO7V zyAIoXOJ8LWwGq>*1{>IRo#4_8hE6>(ALdo!IWx^Jq{2^Hk$m+=k@$YONg4D`yNvfki{c<`TQ?Zgwurczynef`kug8iw7vy;_^8b-vW`H6#VSrNlQk8>KyX897Rmyd<+V+{Ul~W3^ zH|va>le&zB1|W0J@!Q)OIj2Gf=YBY^q9qHyh@}Ty%p7~<*xmQdXGUmUUo+;vE;oI* zh*<9|8#9k_jn}>ybgAGodRN<3^JuGbYjnjeIsXk2nqr{?=lV*$XCo$)+JEUY!x4VK z)$~@*%-TW7eOoxoI36K&vzq-KL|`fVczO9cq-^8Dp`xjSd+hey& zHJM)25Ok@kh+OBtt$Yywa4kYpaQMsQD&+Sx*s@SHS}PsJ^wA4I*!THjrJmu=b>>rB zh|K-~YFU#q&pQ1Cy26w;Ng3R0>ZvZ{=5bA(2Ejw&W94BBDO?KqJv}2MBlR`x(7{Md z;|QD%Rvu4Hr(&Dfw*3&|&z!^6?%f-+fu+}zCp@bBuPgS51?x;i#SN2OvSd=BH;Im-l@^jXf2 zzUdBKvfeD3iJvczQ>?eShLlN4x(yL)6<2NSgI~h9ie$LQGaV24iWDlcaz<;c8IZZzlYsb=$FXS@8e4@c;;)e`XUH&1i~N zfYBA)3tFzEq_ho+Rf61DHF~ZpK>@2w+b+RCGLVY8#qa(wH$U$y3sX2YdTy|>O?W)6 za{ePQe;@jC^J>@UNf+2p*y%ZB59T~ptMGr7thw+?XD^u0+ZJ82ft|S!*RfIYJu}K` z@HB{k*eY09`>AFcutbH(@qQ&Q)N}flb|EU%F;@HwGuFIUcU6)6zn6#}Fs6A8q*8=j zSy|z*704jb-213sTDjPGy9Je+9p{EjyiZv9MxYUUIbW&hT6^gK@nz zs#U_OJXi}~L%9~+Mz>tNSebggLYHPeV6QB@dKesVAW2a6S={r)YtApzQvd7~Ac9x< zKMVABL8RM$WridYVeQleW#MGj)yGbtQV3lc?Uq13`CQN8j`{WVkZ)> zZ7RCDILJnJ>N|wU9wiV!jHIS&vP%XcZueZ!NY&1sD^kCiCf^wM;-K0rHMhh6KFxic zSDCy}%33_xD zgwi4EchWTGjPF}DXko&AhWznBoTI-_jf@j$GmTfx_xgRc=S4|*F)}hDDJM5*@Ljgh z5irmElTR`t>M?46st;2njz4^C_w>hBD4QQ|`Y{&qWOwKpj`U9-XL3u0+syC!Q*5p2 zbf!x#G1||5WL$_*RmNg__pF*IQmS0Kn%>FRuTtoA*@^zlan{Kg^Pk>CV1kYd zdg)FrmylgrCDe6NMO?43QVWOxunNJa6VWV4A5|(_ZDPNK_p=Tp^E%)5=z(Q}7)Z6I=f z71SiU{r(j^P&c5cLhqP5Mao z^n{E?tG6?~fwABD`YEdD1{rd#v&#j21|2r>qbioRw;oVHxY3Uv=jLvxpdIG36mp<* zB#?J?O-}K$(B5t_l9aJAzs^HxjK5?lmc9;B7K%S}-zVN5EC!(tGdiw)$A~rRjpkyU z`Oggz5KEKv49PX_&bPy9XK=cGbAYPhG!>H~pBAIo3krfNvS7mtMj|{>IgDF+!l>lz z>0sF~YoT_W>Xd4rO`pJ@eQ`etbF&ro^ae=qP4)J>1Jk(@?ubq8#$82hj$_>gFSWD3 zDaA((jWdiCWUxs|tb5%pBipnzadM|OGrUv!B;~P>vHWa|SL|TevPu8bEqr7EyqS?z z&?%%pJePm|1xdyP;$x5FU&WTvKp|Hz-m?(jcecKL!QGU{zCEtyrT zH(0Mi5y)QTzQf6G!Pi2&Ehx!Qe(_0P>X&hbtLNdQ;mBfb%(H%aT=ia`*4|wxa^;-w zU_Rihmn7Jo3Q;<$sMuSwb3GQ{{m+^MrTHJ1WKV$iGUal!v$LfI?@`DT2rbywp}Mhz zE--mA>`Wryu>JCoI*vBI^`|i64Oe0hVPmQBcr5<5kpA`QI-Pc3PG}{FP*$S3UhLe- za)rRsVl=fnx|OnHD9C+BDWCiQ!KQ>B|4FG{GkpV~mX4n0xA_+Cb z9Tu0bwtEqw{N=O8ZM+>`N2C(Qy-hbw$h=RMEB*YyVuu5`IoR1Tv0f(a0oKdw!_)=2 zvDlUxKRy78yfE`zpLJiX=O%Os-d!Kzzo#E(2~MaoxXV%~mWz^8I<2#4zc>m1;EGZ+ zX+)*ODngW4gZN?apC=OFj|dbBCb|U?Uvt~LO6SGmwR*^mOlV4<=){u#Yvb{BwOv!g zGSubCW-&(+&bPcp_p34sXLVm?z0U74K|uU4-P}33=lf8G9byn4QvC( zIfLn#76&@`wG5pr`R+V^-)4TxeOBNc-UL zT65+AY!d`NWGNznqX%}4(BQ3cBRsaxv0^s{?ja)KUexQKz1yA~KWxv<3)2f`kD0%f@{5imaZ_n z4zZT#4sX27ON7$+v0L1R+f%$E+yg&yjXUPxKlkncG+&~RTjn@W(#NMhMaw?Zh@PFWWd>Ov^e9LNuS(-TJ*!Zc-W$>_Yas&FKJto5B zSQa2y_d>ipUS|INyG5NwnE14tH;TNlh$Q`8!Te|QE+6mlL&^%rXrV-CoHd7N2ZK$~ z-v#LBOirsMAMHL&OiW;(85thFrm37Y+a%!M6%4e@t$#^{ibSH)t6oGZX5oT(Td}iS z7k8pf<{+4MB-@Am5B3`jE}%*hfpY!}-j5R=TXXZyQBhgBS!;@n-b>xou~$gkU;Tes z0O%1WfZrb<^6$M2^4e7bD=0Y=-;6Vo?lmJ=&V(-9( z#RH`Egk^<9y5h(qFR}P9(NgI*u2#QzwA0O*5ho%Vti3Rp3M#jeEV=TP9_@w3-dKA!{ zfDitg4{#kq@gWE$McD}>2F0P~x{6_1`uA$S$|2(WunCy(f|q$=GNTOu$h| z;gm}i;3222Q#uQp9tvs&b;4u$hQj4`wN*PQ0G|Ttnd!C@!aBkAH7?ZqZd&3KP-6&r zK4*RBvp-CCok(F1TMVcH3TH;22tdFQ0ib9-sRsMiFM+@qU?kUu#A7;<#tRVgPs=CD zA?`f^4-8;#q&nlEr9A~anoyq@sxHpBg53Wym5>GBs$}fEB!EOWAW-VN;I|e$kCRN4 zzkq~KpPMRB*+is2+xtw5xP10=Gb?17`PyN?#>Qp?u#?3SaN4A$QJ~Vt5+z<8nLBvz z_x1N9;xOqiR_G+Lq;+BIc~qx0CvwcS>(=$3IIQvOTa|E&%c94Cf(fc%*jkmTa;0gV zSzlsbHo5=Rwv4mw)uNHanvYwuwvNDi)e3frl$}r{!RwId^sC(_LWGrxM3MK=1gwX= zTR2zmEL=-8c4k@C%T`$`{|22w{!ysVh+U(>Mu*WuTR;`;uk}!w-q<%l;7w3q-0hetY+?R!a#Ort}|=WqiNnRG_fBj27{74 z9F*%;&TU+qsNzi`WG4hswuMkNk$Qr@Iu+z`kdi=yLWI8omcnli&@e`sqYvk+`*kOx zxboT_saYa_O9638(EZxV%5Q)hf4SCt3+R8-_}yLp?CRj|_TZvq|NQ;syZy@+I5Hne z3BowJ3BU13TtY$uV4V>Z_-MKXp#{_LmywYHGM(OlAvhYIOchd32Ba0pLl;zkDD2qR zJ_^*7=NYO1A+j$*%Qn5I#VTyObtB`xWo*96tJNDDirN%k&9POgJ(jsZ%#WOUH9Mf1>4n!^xL49A8IZV6T zP%F3_jtFfpQOl%tc-x~tv;e9{hBQ?C&+nPl?}*db1E!mT`UsVm%Yi=DO{TrVwY>YN zUAUL}omCENKt)Liepd7g=^ZEq3Mc{f1vN|77wx*A65`y=NECo?Tr-)Y;I`5D0qUyJ%GN zaM0IE?J0NQvZi@`cqxIUCS6C^Rmn$EZn5TQl`LNv;#EsP49Ew?!Vjwd6%hQ3D8?g3 zK(Zh52X|$|c@OHC=|ExczT1pW%T)xxB=a^Hz;*L%_O{m}})sk>{QVXs$9d&(>zbl>9Q9ETEPW?9lIj zJC_*QD~;GgcM~QOL|v%VyKLO{6ru1E*lCjsPJcZaay(Kd>$D4j1T*Laq*r`>#jb=! zh?&1(ro-h(Aqjyu?vjweXBSbr!U+lC+3em&N)i zu3wew+Q&+L>F)?o+MwV;EXA-r$pQC$5!Nr_!VC;nj{R9AT}`4O4~U#=D43Z2hV~)_ zP*C4m5YIrxPpFT4$U%NqbzZcbqP*iv5;9?_wp7llTJX0jyomJC?vsw56|kNG0y^9^AA2 zk0gUw0uowv-HcHqiAqmvHjIvgYySSalnt_^YZ-cv*D`zMI*0L!jgm=bXLUvg>t zdGw$XNS?I6ZBG2v}9Y(FTZf%GuW1R zdyK{ac@5g?&U`CVn_T>dUQ--vjwD&hC}7*6AQLOXY%Gcffj2n1UN5L}-ht9X*%D?z ze%}x@)WTyoG%=k<%^sjCF%Cw;0#ciSv=`C^XzrF@Zf`&q{k8TM3Q`0T9Rwb)uRRs^ zOr9sOx&KRt2h0ep3Aq@isz$H^|NW2s<}_;2IH~h^Pw1|u-Elvt=K8vsF*4UC&{PA47BfI%` zWB$hp;wF)~dCc;aGD}2HkN`x#+|XMDPGqw;s{MFlvkN@vz`&O@80YZU4+o(T~^oNFIWD()Zj6&Qy7i(qg!L_0}=lbSs^$dwG1GHCqN)QcRa?O^Llh+*t_ zG8~K~L|N+e_Lh-BgnLTc*K_Z{YiOv)Tp%jGL>+u4@uTV{Fk->+kWtMcQrKDZ4LY*l zLwf%_TZh&s=x-OiI+fu`|81KbG`KEgyPB6A6-&6*;ilAS=y&DgWdpQBs z(5w&1Sy*~j(uZ$u)EvgK?Iu-Orl7X~Vc-k6Qso&H!Ne{K8}tl)Hmm>1m+%Dw(T?#nKbiAwl6I41SzY+s7RCBe^&}RfLb#TgjyU4JGK=`ip zd@w|M9ODx|OCRKQbB-%!gudR_KFSx9#snps+1eK7C|%-R46f_RAR*rq;GJY+9U$fJ zUb4RuXSio~##MK27}S^4t=NtH(5d|%P6U@DU4#sz7D1+JZN1Kx!WGy^jn?s;1^y`B zCeSH)HOUJ#hCSy!+kQw7?T;@QGiY^owr?K!MEn}nPIk*&cUkqbBq~&hgaGsfHbT~;Z}$TPzH!N}t1y7atszuT45@yc+& z;CA^A6aD%kEpFY3@jm09&UVJie?xQg_?Ks2QG#sb?~7FMvY~YB_{?ao6&uw2q}Ky0 z9^}isn%@0VpJzB1B%+h_b(_TB=V8jsDb(YazRmL>7{w{yhqGl7aKGPoA*(IUv|5%I zpj1e{I)CUOBc7#UFr2;Lt_RP`l+P578hG6){aVj26c9ZA=R4hMY_w*BXNHY3#w9#I zx}FxH0D%-EyfZ|v>P498tjA!Q`V)5dD*F}jWz|(!bHY=JhBk)vVl4f7JlQlz_#u(Y zWKq!3;nR`-zP=Y+j^ko;eI4%`H}ze9DQF8z)`$LVfsB!(KDjyfk}obkv^(Sa^$DYe zi%$FLc$AjKH!8WeiJ2fXMW?+EbHBt z4eFwP;%LCNpxO-*x_a#5Z|YNm=FBMiQ#y~BK&Reu9_#<4KC)w*!dO?z()h#8(87~L znsscXp@BO-K3aarD4Otvn>!h*ui(ub&ai^4@0*eEtR!Bw*q*1Z7i={GD2%8!iS8=+ zS0vPN1bis>jsZfYx&DuuR3Vcoc@_hbmG&|kSOrE(UHMdN_klL_gN zUUaGGv>Xw|>l6@0!B2_-B~41_K-%oK1ij@v;s8xB$aR3(Z36=wf#~mA!#k#!U85 zI>`P6paWrJWV8#&6vYU4sMhio6_}5v*zgwqWs%h))UniH#BBo+bj~L`qK~x4w32d! zv)}XYobxRaG`)Zr`!`JRQ{enDgZtC&5Mh!`=3SO~@p;!L&lsWm+WO*2X~w5z&v*$F z@m`qtAS)-A_%?TV5lj=KA#WvKX9=zV@gWzZwG69CnJ4``yfuvBKdD56|L{R)7Pv zV>0;XrlpIGdgkzeyYWwIv%5+l*fGfDTaIre^;KzUX>N8#(eypA5j;=0cI;L%MCWJa z&I+xSs+Q+aEOd7Z<1xhL=>7hZSP@xdpA@-YiSzFR@@MaJN^;Y~`S=&2!slHWCrWb8 zDQUx-xfUNILH8&=U0kqPkZx)E;KovNdov&ng{Je-rI;f^KYpzqZ8~ohR*SXFdjfXR z+snL2>)0tp1<98LV@|>&tBg!7QKicORo34xi5K@aOI6*x%2&GRPbf-?Gn*Ps7lO{g z*e3gx6RDz;xh7=ff~{AfpWMxy!uei#hGP2UQRS#_NS_~D51%%IJwwK>fbLb_1;{?2 zQt|K%-*V;ZpoyIM=EEoyVXh5L_3_d*YUNInpUi5Cw2#77y``FBqRJF839*LKy{PM6 zJ_%t^kw+qrLRo{Mtlxt13)r)$_i~}bih{YtI?u`keNWLe;6fdiDO6JkOUlb5WUG^4 zlfTLet1!^fdF+HxzP!Ac9SF84e8W2%f9%3rf&*Sp86e1Uu4oYHE{wa>;-PKUob}Vr z!q~iKvo*$uH%<2jH+#Ca3}8gTdl0XD&3t-KGGn64WZ@sXneF_;2{^)mg|x%Wo71^O z*R?$|Q{xqV!2JeP_?~d};^_K=Zku&%rGGyH?_>xbBTp zeaC!#qzW(`Twwsdra{elc_NtbQV>Mfz5}^+hrxRxP?o}qMK&99@+|L;Wpf8`GNMkI zT~XooO6rH)#H5%gV#skZQATFtEH>b$+)7XM6kymIvSj`s5MQW#7^YDBFjD80l~xMk zIWOC<8r%yQQCg#<4+yiTMUfV@9V7Jbq+EY~UhaL|^KQJ&hVXlth@j}fQRn3eC;;1Q z>EKhQfKjc!Wovc&g&#d**~(21zKoH-9YktKz-;gv;R91Pb5|ib88cqIRQ}j3c>z9! z$?qRgiek6BPoBZK8t?@0UW$Grcx_FiUguRHqiFNXTd%L*>>o(D z3MO?Q;Pn3L1LC%pE@)Z$*+a=F;AOU2)jvikT{=y6inu1h3{QlL$A9sy7Af>txwf`^ z+c&mVfPel<{(M92WSui(_qt#7PDAc@LX6>7csN32kAI>TqgVGu)#poJMa%X_(Dp}g zq&J6!V-!10eqw~pBCF{DDRQ|k(a=t3??&*e(!TLx3LL|ak>}Sn_TM^xbavWnBXZey zuL&b_PjZV;U{rm?vrVDNJGO)H``%`8tv8Pv_M-D&RVLw8^zBlxu|zO*7L7_iVcRmX+-T69IecT*LVo%|hj; zNQJZfIh0==SrFc9X&eTdzCRfDMhh+yQnBG=a$V+x%WG+id?2}_lb_ysYkD+?8Gwa* zU$iIoEr`DH(lHY&LxXvMzC?eXsC7zO9&Iptd&VUe%4N#d-pf-O;1O_*1Ro$lhpOjp zjrc>t2$ArB!T1a=Hd{Ll?KljlGbC#-3@`O^iYO#&;+tH@Lljyz1uPuAq@I z3tMX$r5Oy7zbGcjNXwjIVEVT3@yfbD$`HA_J`8PHnR=(^hz?T%Lwpz=%YH3J{7ch`^MV?`vC$!LGP(Dc) z94WB;#x}Z2d#K~8PXcRDQBr$elLDjNG~;?%&($J;`xQvKKi_|fCXx#K`&XSOkr^U9WpaXKn)6usPM9CGDe>qf&}D$Ki402(3XvY zFV&NzGrWj;y&bb)&JRvp1b4E?*+5MFUdY$GPyRN?K9kppwA*?bg~c5wF)3k2Oh4ks z8dU7^Jgn~x9#&F}?$4tfNVC5!h#xkj{Gyq9=k792?3e!+Q&$-mb-T0?1!+(aq(wTH zt|e5uOS-$eK^Bpelw2B#rI+sR?(XjHj(4B)9(~UD{jk6LKXJ`9bIs6&?vh>5r>g1a zw1axDRAnz*$8X0h*+~ISMcmF-8;n;QUETHL%JYi}sb=hyZWy(EK5Y{-pyO>q-Q9c$ z&`GzK;a+*O^VA35h?ZKOyC>=+&)@$Y&-~(5%V>5^5=!+k$n@MUXP{FnQs<`n7Tk-& z{z38gw4-O*Wssg~Tp`YQK|gc4-nA2^UHRoy%TY zC`bG031~{WD>`|kEa59{dkZK0?$5)DvH)F{N3fhm_ACFRc zc=sbig~3| zc_25gsDMj#_$n^)`ICLXg|U$OT#6tPu2o*CDuti2gN8zVDRKq=9A7 z)`#~uM!M6=KwVO&Ic0}VThqdtQlmJ%C+zr@#jbTtL|$A%wqn{;GKcq7$auKD&c{Qp zx}u_>z*3>fp

_X3q6qvcJV5}5GZvYdM}Q0zJc4vNvJh?HObS6e&y)NhIfkds4)V> z=d*zrw;hi;y>oEt^V9gEEFojg9yTXqqd@z6AsO%lc(waA*JDnO4kP&4V{eTxgnp(T z)1HDMbA}(I{!4ds$x1a5@*i{k{>cde3oat_`uAkn*|@iBYATkqtijwp-oo1(i=-mU zw8sZ^x?isC0K81m{2CH{yA`QDabhRFv)lFFM$E}06%FE0(Z|O&9>H8Sf)yHj>W4w? z5@3q7FWoDaG zyd`>~O+==Yq-{<=GGsG}zx;3bg`pR~2Ua*0ShvU*Rs=oNdYiB5TAb)F=Pg*RNAzIi zjuvnG5tR;`fXY_k!uIJ+jhJc=_9@Td(He!wj*`TdvK-0=OM36vgiuB=k2J-W`DR?0 z%aqLyfNU7J#NiIv?Ss83LZ}s~{J8b0-XqzqO{V)8Vd0566gj8Uat97|TIZ7I$OXv~ z%9f;Qm18^Jcgr()S8=cf*)-ZvO*3(?-&Q{rY)@pd206m`wdXzOqqH1s;%M*gbz_p_ z;`EF{-iWmUxQN^{c7IQr6jY(%<9EVVews-Jd@JOBi%}as^XC681{RiuKYvH}-A#GU zK=zph_ZoeHBkEHZ|7!j|$?({&TC@muWvnyQsF|&P%$f1}!%Dw8$B^Oem!VdS8S+DR35jbh?hB5uIGRVNWAt1Z#fL+zB)$wWirCihdRjne&+C=w zL!urqQi<-{1Q5Q`O+HK>c^{|DQBrF0exO$sPb*6>F~e#`)w- z26wgc_ECXJP_TR@F1gH8a%)I#__CU?^0dsl`N5{ws@+z;UF)`A@Wdn7*&NHf>K3ec zW~fKN9%30JATV)XU1i8xu()fNh(A4uU=Wyu^6etXio@J_GyCFe$}-|u4HmA%s@+VI zhvx(eM0C^ehCMRD@7Do1&D&vs@6#eaB7V1)wu8F`m0)xYc9FPb@e%)|8DXlm_@nnZ zV2Um?xHkv8mdLg3gb#R})MP2&mMPvGiFK`7B*XKuNHId*uw_3+L~suCj# zp5fSTr;%hzGVRlbSo6eaq%{_9x#z3#6VgY>`}jovJUy*-=1Q)jex}mU(1mDS`}K+0 z1^cAHJHXOu-#APPRH339%Q0DR$^drY!)0(u@-+G2{yXy9x`)@5@)UoGvzBb|BYY&71(Nd=Q-ULfC zNO<@`d&`gea4~pZ_IKY06SjmhnB#-R{EeowsNa*S*O(l}Bs>T;t9j-Qn?y!vXbcD) zv#XwSg&mjmU*3$S>{m72%^TL|o;Nicc7jWqHSG4!v1L#oKO$L}{Q1=19O~4&#teCx zoX(-15B;p8BtIybZLYe0tn^%J(Ay8u)Y#`aN7nrndg3RQ0r%HhJ~hC>>nW(%R!>*) zGKPlix@e^3@ngA>))g5WY9}6prFvz3VJzYkd@~%ql#1eu8--F=_iRc??fkOW)c|ZN{*+RIO!2kJ`s^!TU;6CepQ*bKjn_ zdzh3|x54`n4;Ifk)OEn2-rI#P7h2>rqP<1#5gX?jPphrKd{#v-5kfC7_+D@yZiBW|K{Vtw2s%UiY-$jI1 zL2N>r4T~6)pT6Gq(cWdfmc-NkrMv@B@0cbf;iGh9K_Ms@G_fSWKbb{hK-b5tD~=hu z--*(EF1ra1Esw@@rwHolUQSy$U(8H;p3xFv%ouzG-Lr~Ia7&~s0#mZOX>e}ugeje& z5kBA;Kf~|XBLAe)|HrEa2nK5!@>crPOpAR3KXS5}8U>0Erj4akOx_{TAaNX&Xx0u5 zS5ToC3cRLyTm5tSFd?|x#c!)l)UkI40V3(FeHuy(UU;f3lZ1TPEp>hn0F@Rx)U{@f z?r!ZwH-F`uzh}|wMe-z6v=Vi+^DK^7Nes&&z|RTUDkhQdvk-gzZHs|rwIQa$d!XJ) z* zGv9V4!P?||%8X0)=014^CgH2#knbz0-mOSPK%nGpj2NwgFbp`}*Fd()4vV#_4mYid zWf~^ms5LnE9f0YI-5l=DriYt{jKoid?4yu8RrxF|KM-+P5F!1|a&EBqx#Gmv9OvR4 zV_~HMO%O%cseaYtajBqTR1hw?xM%48K6v(Z5fn0MQ9iG0F1TAV??r{`PATI@ z-!+?=tN37QAEvTs-KF>P>op*wuVeur%k!O;V@(XMP&6w7 ztNX*zVfX_YYyF}%g0L$twm4IQx8=@1??>L_U-&oweCj~>`es;x6+i#o#E=9wX>X;2 zNO19JJfDT60wr`6(fev=XD8CFP0#^v?LbS$YV{>JpN4XsG^8ji;djiL_!8GH5lP0- z@We`<9V>1i>|`+oU|{m`E=nCQ8*e08lU71vp$`jJz>4q5L(X^6;_&O-^NgLHzDbi7 z{?397qJHA=0ip4^w?cW+R!tK-Etk~(`sW?2T#+MId_NJz5BPtd7S{QMJ?*Twng&nX zjHh)R(4qf4tQRz%vea^EWfYBkMT3!?)IC+$QAls1WuM!)r#Js1kX}A$r_}I!gcF&p zzfq>HjR3`!;rGTaLySot{93T-yXIvTF!+~~=`NqQ7%AqeKSGE!?{YhQHF_1vA>Upx zv%yp#)xc(Q;zqrm7CZ|ok4L5?Q}yVCB;Dp$FU6G|S3bYlFZnq6eGh#P8}MO@P!$Ug zF;7faBAXp3o{~SD`4`-$zKL1{3*XsYH7;YSu%E;$SgW>Ws@9c!&orBc#dBYdr?>F( zO^TUa`7?B%$4|T|&!pYiSWWNfvu5>|MoajUeL8qnee}1>F6J39`okZEoVcSEVq;cZ z=zB)*fV@-x`os**C%A*_h5_+G5BpQzgpkNvTlV!L8&g&51jgtvY0u$?9lE|!{ZohL zTf}C4g;4_(k{!8wJs^TftLcZ5?zM%GaV_6UbZN`>S6Yh}%K6O$&4s18^!@Q!<0<2d z;C0A~kK6b{t567!F(CpbdgHbeH(qXf+F-e($!5ZtmrdbOJ_Z}yRvBbP-=uAhT~*9d zhyYoP%`HA9;dmfaJQO8?ETsa&ifm*=uPGT^oh>UBwr#Kbwrr zh{i9n3|zM~NLw7mA)sDS=C$+nsp5M1!|R1Cj!i6YL{6S6bz@W!U#Q_9be~oDvqdu@ z#c|DKB4y{$`d?lQT-AE}Blt&T6AJR##_4VOU{hFNA8R;OE0|^(d2KbtJ>drXoy**+ z1YTm!r)6BX)T7#@7!(dD6_#jdTPYch?TTC3%}8(&o9PCR)4aXHLqs(pk%d1$kBCq6 z{u<2{76xi8FRPxK)3Cf^P_F`pCK=}iOca0EHbXTVnD!#7)iEvWdsoZOfg}Q@^s3;S?pnNI@!pN&_j$&jbx=s+o|e4} z+E7Vq#;!tLn%!0qjtsMKY213E>ovE3tZkAu+W+1zO>Cq~cxXDKoJBr*&sqW2*`Jk* z^|Q8pPB35#O9L;}Cs(0ly|o2bb@7iy~>n}(u{q@LkBKye_DeZ}Y zr!Fu~NHlwBV;J-lD)!`2nQD`e7rU1lnaZ5Ge70fiWEt8B*s{mDBA4>Y@8(y+Gtf&D zRzvLVh?RC-ukUPpj%ks@2Yqi-P=3?H1LT zb5QR*;EB;D!Lt}vWv5ML9)|^J-H6>? zs%5`%;?$QpSQ zS=Rg!ygAZ0f1@Q95Pp^a2QKh3$V_6uWxoA2=W@wmr6B42p;PU>q66S+FYZSmoHbC( z;A)Sv8j_%ieb5#8M)$V$P+e<6x3;KIdz}*HMZ}b}aTm#06XX zYN-E{L40%S&9_mp;f0dJ%j{Mi&NQ0y0G*rfo&f`%vPGeVle`WlRV3%%V|m7DACuXi z1my!GUZya1*8vyE6V7#T9u?h0m!+3@n?qu(dPfb(ynWc-vgK*VItWg(uLuxTXE=r9tcPJ?Aq z&&7{k90vsSL($$`LvQZtfov*<^d_<&fri*4u%A#FMeatT{l$LLzhNa3>CG{h>T~Vp zNqFj1;GV#9&0%t>Mdml>ew}{BH`na-^^#QkQRXv*DSOG08Q;EsGE?qRt#$@8YSs<^U+%*^ z8Cotv!Krc$E-=fTZlDEtzxK@egW}?rM)=w0D=Y8T-W)6F}GTqR+=r**g9e zhwDC<8Dgnb%lu{ODS)fz;trsJ;%; z{jjqaSI51iS$Yv7@(wY!%kC&>urOy4()BzmnFPi8dM1<=psGjkdf&64X}C&x ztdDGeWL|7Jf46A$?W;;GD!{YawK79JcR@U2rsl6WG08RE_N`IOx+EEC)P+)-QdU}y3V@x)7v3by#qNYO!LJ_ zzUad{1yW%x33=OmM<5x{Y(FuzrRZxgrHPI%^U?a3bA+3IoR>=EC;PY6C#nHe4K-%S zhvMX)4v;gS9nAu>i#|>uStW9Y8?O7SFdrcNEqQL>&0cI-CaX79TG<3h7RVQvyjR49 zY~G2#8K8rCV?6&*mbTi?QJ;A6upHO(7(6<$@G*OIzNfX5F3cG{2QE6Ym@{?zOeJhi ziFYYIAauHhHRUbGTG>A;(GtLEY`mus@w4B_;b)ntnn<{f#iw-J1}Ve6@?PZ+Tx&KURjm zS85hrWD`3I%Wtz0xm@J$!V$4}mzBrUBokD(csI6 zla8*j3v*6zV^MwF+)Uo{c_#!9Y!Wj%#W4;*w;sz=Tag*r_0}vs!$g1mcB1Z?E)mKN zeDPK$hrz*)YAVnxM|5Su@QCE5wJGYd_kii*13yQ;l9-vsZ;ZPA?Zrgnfj*ASO^VGb zH1^j?(4|=Fvt3=#(1d}skpAg(Nxu`AjH7kYl=~y#t;zO1I$iZIfBx{Y4X1MebYT(a z?nJf1vy4u6U& zGDAcCZ%8PEgI}TX4dEvO-oJskunwI&3>iL`wCl#2#Ef-+70RD!_?Tz|BiJ|28HD)rhq<=BLUM-n*NwE-^ogRe#EcOS5)Z;N-ekWIj_raL>k2=9ldyV13z5$llFTvyTbaVDxAw>iF1%Pl6A$Q zof|*O)#A&v27!^RC|VNQ+y>~k)b1%PfdDEiTPQjsA0hYSd%8i10tJhkXg7O)f-kx7 zhXyJY7#Ltg4kX+|5$s8iVT*ZV68CCoSJqTvFB41hQ6Q;CWZObN$IP^bJeDjK`zGrm zP9~A4b*A#+_JR!(_5AOv%DMQgR|^X0eP}=b_*OjJ3$5atPp)&sNg9^RwtTAF^~Vro!(fAyF;a6?xN+o8}tN&B=N3p`Pe)v zOydx@e>o8|OoM!6sYugXP^6q}f@}uB?1^MUL`6`S>@8n(4!_v3T8vk_z_>iVK+;#9 zjZeG1a9j=~;yV7e-rZdVT3?}#AYG*c#;yuOmSCRu? z2ejQ4FskWM{7cJWQ`!x^TNQryaVq@2ey*|ElKYe4uFj&ub&fx{569F7dt~x(r+Ava zzq|3cG{m02^6+|zL9lVd6s2~}YA#TJ-?U3NyK4q$Q|Vvw91JNevt-tCxJ&wmHJ2gyZbj zG#4#u)z7&R)svKFIhO(F*c<=$_tJ(^7y6>SCRbwiM3g<{@^6rC3(in?0{a9E;U*wc z+WeY#0q8KXHoCIj$*9S%q|VQ7I@ptUc~WCHXD=@;@XTe6BeJ|>Mpk-apQyUY{P1tL zJ|4?QKI1nstrIMd46pFx z`C5?;hvZ~AYSE4L?wDXq@y+Mi1ocE=leNe~P)YTozQPPq=;V`*7{6h;NW%5qxs94m z*_ssUk(zc@9StN%v@tP(BU+%$Fhbc?)e}c;qub8yHjsG_{W-pVtD&P}UkSxqy(zR= z!mie(MyM$BhRw%+7tE*MGiBxph*YK57Tds-PV4W< zpczG@WQW_e*xHM!B!y~BXA*jKbx<0Pl3EHXiX}zXdA9Bq!C}e4RAcek93pwvGJ3Y) zjT}wd%wDNcJalSNsHs$N+!!ecJ-1T%{q@2h0B&K&eK!4e}G?F~6aA87#`~aoWgU*b$I@+%eS{WNj__h(n>| zZO;29yMt|9#uEqge?WvZG7agslU5&}7Z64FI`aJc6dm?NntNGeV=-LgWy5?JN{y$? zE*y;XVeO|@RShETM^?HsY&7`kLMP|>`Qx5Jc~8s_6lZErQM9>%?y!w7kfW{Sv7`{w z-gigu850}AyuzIMD<@8pe#`#01!@k#n34P|A$D`?o>Kfxw$%m+i@`u^XWvlr&*^vO zyBU1z2|07(-{}zf;4*~V0>aCOQk@W?p>o2#Q{WPh+TK*r7+8E)Jybqqdc`BK@GVPHe~|-Pa2izRRNBUt(nY9l?9GY z@2uQJ^_lNwOgs;iNX?-tpRJn{^4=8qcaOgGuJ{jwY3Af-KH^rF^0~3^B_6FGbkiKw zluEnhD0edXr{8SR=)_6EI9={`c{3pv84*VPzkS1B2s?_=SCCI&FIV1_3hCpEvU&3d zrPqykxVRtTFci2?CZUYBb4hGD{M|J&UCs_M6$F>MngUD(y>q zyV|sUe~vn5AmBzL%b1Z(IL`i9l{txXh(kRX2Yj1{doX!e@sYS$-_%ue-8xXPZ1%wW zu)y2#wC;S&;fvpSHDNoEjU}grv&e2jOb0c<-;|xpcGPQld}^r)adx|u1P;$Q3m398 z{0h@+`xPchLt$Ug?6>tIE)6S_+R(hE>1N|ek64p$nt;oF@4ghQJB)^>+w#u5&gwy( zR%qxc!X1VZa$caL++m*A%Oq7<$L{v0z5#BcWxtY2q`oN`oDbmQx zF|2HX56+o~o|;_cu0$U{`bz(CmG3QnNU%OmzkordyxvGC}5-w+CTM*W;%Nak#I10fEhQ(%hc4d{|yox2+`l^Z8FQU3@$eH4->_Zh|k5Z40C=gNAua*{c3 zcWnr*UCR5P@rLCPn^f4!=F&+5$9ecWy-dkkLLLR|bmzF=W=mT0Jlm7+#3S}U>KXT%XzStVI6zT7VH$CRI=#J`n<1gEds#pH)LNWo{J z=__52tiXCo8rGcUi&rO+)?Vc80&J00%*s3>X(xvbC5Vqth+R`vM&=V&8(%Hpn5j2 zz#*8bajUVZJRUVpt~r2{LMCRYhvNWN{JhSIKhZ>u6I;bBb>}3g4dHW*2T|7v|t;74h>^mt2!k&`S?zIRN}KKJuHYh;{_v z(~nWslJom7{Fcvq2Oq&Fu5!arEDC92u$_Ac>r&r#JX}cV+!V4uq5g#}24D3Iir@`# z)~!mvN^Sy7nbN>9k=D#lW){Y&w3`RGKF?)7l+#Gkc=e^TNC%@2{hjUblZ3;Av9%(_ zjE!3m$n*vkB0-X>M;jqQ#G}(Qb+-p^m&El?b$V6Pcg5m^kE)xSc^r?YaNHOAAa4H!%HPlSx9->-b?`kpDTL7z`lNq_5~ejAIX#XMpuaSDE-932Sbv zhxy9VpLVK-s1mqr0q_EvNG#`?Tw}lNsqOpdvrjTNMQffg z%+Rz4F`ia7c^B0CS+R{({krGGtDXyFc^pW6SKskf5XGE=iU@&)2>vgLC@c?~TJV;R zWuH5fy#sB39f!XLibep^7A|fAkSw-@$EVWXlvN*D$Byb$G;8 z??>W;F)s6Pr1%zB*D?zx-1@J1m%=uRa<`fK99~I>wH)m9#Q+hKS;pQZ2DgedKdjwS zT+_T3zs2RfQN59$#BoV&nmvmH-uQ6|`kd99Ycxh7TI4{g?|*T^ z_ZDH8ui?g3s}0m^?%j)aa*m`B?>MtfzqzZDbS*#eYpyYnZ=D$$eoFMt%S8yt`kD}& z4hZ^E%Gt4X#gDy1TohkhD$<} zyU&K3=+CoZAt`;jUGc@lKtrR6Wj`zZ;gy3>t2NZ5bW}0W80cQ&w$SL6>wOqL{XAvA zwpq0YVTK40YGP8|%p)5pjCiTa30=`ND>Pbm8}$dvQZCPA96C$AQhj zifemwri}hEluOCU$^@mOWKM7s(UN(Wp^VUUUNgI@!VG;*wrTA_)tdT+^9A=WcE4Fk z85Rhmct3}QGl?@%Lv;x;oPzLDo!ntqswZ)fW^HqfE@zSj)R0;3Eh=q~ z9nZVv2E^qU`3V&WT>bcK7wZ%)RcWKZXOR?*|BUgWmVAG>N}VE@4{A37!q|o~i@;BN z(P!xL}rY8!{k_H)M#zi&;I--k_m?~Z(h<8-Y$XKMzs*DqOBUnYv>_Oq!5ndjkS z4(Ob2?#9wpCTj95p|YK$sF>pP?}mqJIBTw=#kO6mvXl7#w3)G5n*A!384|{oIsCxE zdpMTGP^;KVgX7M6SrPN;oTodlM67dHc4?s^nNr=~BDMubo&+emn#t~$3Fj~LFQ!65 z`Hi3kH@;=pw4l6gH?wIm2|nu^mKuIDvwC0xLyb0Fk0#e6O$Tf(7XoC5EfZHjYF8#r zCYz0ITfptR#0?;_YVw&z`HSkXhrdOZWUxR*gAGU~oEs@BpW zyKcMW@;n%zpD#=rMql+9+gw5H)pXg>x3Rz=G$K@Z8;N9ac{TvgNS zLV2NMPfhfjsk9ckt<+sdp6*Y?T2uW_0LnXg*wWPyn1?&az}0)z0uL+p;ZrjvoHfO4 z2N)X*oKh9v2m>TJ7a&a|PH3En*`SDtgYk*w9>gyAZVXR0VkhlRUeG+?eg^>i44%Kz zl&xpyrnj89!+~O3)LF7DqU-Koy)TvMl@WgS?$-IijRNXziIA0i1g-Mii!Qm>of3#K zYCG%deov&e+(4&kl%?2En0lCGS%L^0>6`p`ssntMrdFSf!cs{NS5&&Tz9ge`Q&CC& zOIl;WiLC(TQ8jA zMznmHtM}us?tC*F+0}|PAWijlDsdoq0_xf}HvrMm?#;39yb%h|;PAjQfmqvDt3>s^ z&LM)XO(XXFV%)*hgs9$PDJ!OKFtcS%DfFmoc-f<9(`{XE_}#41t|fL-l~vxF0(Tt0 z0_UHXrmBUJkUigCEF6kAG}Q#w%{P~Nub-m_n(joGV@JUg`C8vV)TYT1x29gtaBav~ zwF90b4LxuYh<}8rC}LN*4#m>WQor`B&=}-*f2WEQ<4zsl!lA5ft$OI`nFcwADqZ%= z@VIaPaExMMlKx(cERlzDncI2h-!KN0+AeSJm-)azoCx{=ax}V^3%5EXAQlkh0H?-Z zGRYAk*P|XgELIo_6)#E}=1wxl5tij7vX8#k8<>}QNaV)G)n)mgK(2s?h4y_jCL=FT z0-DWYV3teH!Qn6#Lii>TMY{ij1Ql;zVfx(hQ-FH?sO`R}hhh7fCz`d}Dz`DK&71K21X6g&_5IDy?jO1_*%USuH{k3bZ z_DS{9hg8Kj$0uaBcSDmchrjBEH6m)f`FVXio=NV8y%FeNgk#vSiweuw7MRG~JRxW-Vx-fr{fcY|_B2e=dFX{AmmuROj;ilG?SukTXZ+@$q3+FtIXJSNC|c2Fr%@!26=-ie!H$ zVn~yPi(|eXx3qyuZFMX;3EhInD{vOTtPJfwcpA;Q4u3ja(l5DaYA^l9`LDhHqhWU= zs(jY=+}WN49)|Ak`k2eIB$`+f@n6XUd zgeiFy&AlP^2gPzWel%(N^=sw%@kC7W0@>P-sx;U_CQJ=*sIxz%A>zhWL|8bZu5bePWHtG}<(kX08Que_s3 z(J_iNkW@2DSf@{TuYZSd;(8xYzyML`eT}!}A$vnKQTz%_i2E1*e_}xWM`JRZx4+Lb zF)kp;pTo=}b23AMSHlil%(|-;JkkMc3@FSPS^0G}=R#zjGAu!}O^w&Ss&#ws=q6Ll zl}Hmk(;2b@`#15l+-B35e|k+>oCldd8h3MMG7gTHM2aG{VID2qOg9lEOtw<&Jn`R0 zg_Pyo096*C5pPy&9IX@Fb60wLN09Hij=``jzWp3vN6SACNc7kaZmxqg?!Z@0s01TZt^c7DI_=#E_D@ zM!dSU=JXNQmweEjUjo^eh?rFOU(9(A*4<<*0^Evg}U|9&On zLAqT4CgMK;PWllSaf%{B!w}TdjBmsiVWJ~#hd{@#l&#|6D;B-AL$2%c za!PY2Db%PKi_vIseyjtkk}&4If(_0bv_P#JaZI4US2rPd>f4CU^j5{#Ml(1YXMq{= zqnU#fd|$X#d<44Q7OSenz|@IXrBG5M*$<944D&s-?@h*FD z8)9^Ly#Kyr-lm_vx!j1!n-%&VhlGguaVzy2oHG(_k!8*^vO*AqL+6+DpA?ae0fK@ z=H`U8KbJI21WZ|Sf+;S~>hnSbiv~>yS(0Q#$$^>iH^iA~XRD1#PuCO334=u=W~piA zCdM`+#8uS7@&0#hrnXjsnVu45`g;{MN)}4zMe>Ro4C@WwK2 z^n7-_d)M}v+5j)WI@2U3m@J3i4_-QmS#yZ5atWd`cC1sU0gitE+ST#P3Pk%0_7JNH z9>nYm@Z2%liP2jmma{F+7c`>%)9>Z*&+xyPG% zA$sa2pGzkB_)XMCmT&dk7t5{clPzL3AVIY(X)i;(Y`fO9$rrng9;MKB3(AAxsjq4| zc-sUpAIHl&5n($cEpC@CL?j4OhS}e$;s3BJ(bYqyNk{oZqkU>g`!v$}y*ac*K;V^D z(RE@$#8paNt&xjP)JaxxsS2&HXubYyrLT)+nP{;}=UTPv4By?Q7vXi-Rg8Ibs*am` zz5v-2+RGT~)?X)QW0oF+Fxi9Zpi>j_QEb7Dp4D$z`RXtCJ_Mmc3MB3Hom!NYq=~x*f{R#`2fY$dK7gAoG zyYAwVuh*hRnbt@NmqrvH?Y%9RdwRlKhhWvLT|!6y4;^Sakep1cSpf@!LSk`#Gu_D^ zGsZO38uc@GF2F8S8L!jlZ>91EH>g}R6=@o@Q07@@@(d_&<}D#?y!rsI z=UQ#*8Z_7wi;|+%A@NgWyp$DvwovY1nU#a~@(MrJ(2~3nC&n%dlj-rHh5peol;F!B z(VWJIBfyBrG`j~fvFx@cl==|kb=YSYqY7J3ugV+4@s}+)gTZpc5S&S2S};JSFUpdG zwKBg)Pg2#gc5&TF-_-KaIIYp8^$M(G#rH8Ah3q`IH(AC}W;C=?UFj@Zu}Fr#DUSxj zBo0NMqoC8_5msUf$a{PDKP?l_pL5>Myg>U4{l-cp_ z=Bc@4I?b9@dUY(7?nW!wwB?Ew9;XN)oiVc8hBB`)E}a!;L7;>3SXy@;iC&+6iH2A7 zRjm(BItPzP!MyO>1J;vy6VLT4tl-7;-z+6-4M3a6lNN<}EW;{Rhg(v)Zy;5W|ESr9 z#hxP>O54Nw(eYu;bq6Pk7gu6EG1E3UJHn8S}3-cx=Ew{V1BexrLNB_Z*R}Ss^R*oi*k%Hlg`bSgCnl~v$r(fUS za`c7nKlEIlU$bob&036ly0H)=A8dn|N#vs<(hQ@`Tg zk|xN@JC4blQ@*A+n`DpHF)wvF;1{kyH8PjhO`e*4}fAD7K9^Gu#VvUnD%)8$28HZK?eM~fFbo_*G@9%L{z66CG3)|3nv`22fn&E2cd zj6E?YPV1DgUZz;SPh|M&fUTfLt+yv0@%-1qt_|mLMG_Q4>^odMR3W~NNGe$4_{m^g zmm-!`;U_5*hA1xWYAF$Hr_Y~cm_^TgMU&#R&wa`P1OT5$X;CZbl#4{4%XdRM#hTYb zbjHWsC#S%w*0;m!fr9H-89tG=Nv!vH+fW)#WY@Z_tKek>ymoH&A)8z zOmzO9k`CAbGn;4a&zJXaAVQ^cnrL_cp9|JeBSJ$@1OpltW~Lw4Q;wfkPh_v58Rf-E zIVrA6TN6h9d!Dmw#Z2)a7moiS;b9{553iV!RIt?asSe9SE#67`iuP}g^UYibCVEK_ zEHb(qQ_|uucxb#Yi?2_vVu+n0?<$$G3cQya#a?n$DmNctwE=s&G?u5=D;(M7qu;3x z)jKJuyr?!;WNessI2+9b7P4-6j?>xFCh)7c=JaosSXLO`7$$W9YPFv8fDhoUd;{p| z&s)5l{a1{qZI?aD5n{T1go^<6$=8x=l>>Q*tFmcR?7!9 z0eLDH<=~+f!1qa$daq$%x9Gk3=GIX*rs`sw2s~8i(bCms$4=eUJX%NFqf)`sM2vd< z?y4!w_L8d~=ggC}AH=c^Uu4Qr>D;HCv)utH9g@ZT-X%D-q2Bbd`6A;29&ep>r@Mj? zw;wZKU=e7yx3^#}m|!okO~lZj{-m@FtQE2;Pm{lZkSZ%R1n1^)EwW9zZIZN%m$ip=dgDO;@7RZtcZ0Z<(>F?)_4$((*#}sD&%$$Y9fwIq#{{ ze(Aa|zxNLJ7141PgKTeVCI^cLR5C|1O`8|@F?I3Hv;SYThxPqa5Bz&6Dx*3(SLx~h zYwya#p=_i67`x(4N~J{`vbB&cyJ%&UZR|sZEMw0MV@plFqBpXeK?-9VWScC*P;blF zD!XBZtc4l7F!&z5C47H>|9n^T*K^HvKj%63xz9QG?_PiVs<5idDdS>$lImQI|l?zflL6;9~q8W`jo+ZQi`d0M!6T054*3Zugjjn)4Ql^aY=aTESF z=nNv++m2jdJ@2ObZej;i`kUy>9HPhh=EIRvj)RBiOPUd$Mk z&bd@C8w$!U7!ufpI?CX;A}IepYbJWH$T8%Nn=UoR$HX?^-~HY&4Qx-V-9wTk_3eL< z%=$0u9aiECA7>rE(nN&<>DfI2-`~#>&V6ee)~hD?M~6gBVVU#B3Kf?PitcNaCI%FW%FOt=u)G&N$?qYVw+)6lCzr!Lbg zl6b?le5%BkXjj`Eo01P=P?_VA+A(iOl7sf1N)8U&SCB9(@%RBk_^wvBdQ$fiX6WA8 z_*R5WUC`-K|9?C48dZlPfq=?Hm|fYuxJMA*koKu=^7oPg&~%yLqbV#GKnEmF&xM_0 zspx;7RXP=ZAl=?&puoYIZ{_=l$)d8xU(W)azf~?tHii?lWyMZ)G5skMpjjWt$I(*h ziZhb@^FmtcG~@Axv;H&nGcI&Zn0$WUr%2ZEhB_YHht`{LMyfCe>K7abGJ)<5U?$;o zp0d~^;+BE26+Zj@wEtN@Uq9;*1G(dftbGffHwA|^pAfL4Vxn}O`67Eqt|9(8IawL~5)>~% zQ&yP?)Q`HJUUpbon3yD1M_>V1;C@eTSg;g>-i>FSuX%CeTEy+=>Qqi$y|a1xxf9k; zx zV2JjmU%RQ-B^m6{07;>X{yz5`tp3-x1wR80J7^x=uv_w{BynJuLTs&>_QCauvY)~< z)>bwT^8;jo<=S{?gC)1+R1d z>SuqI*Z~~tle%=D?SDyP2kK{_7?#PpZt9;V-~uj+5j?I1-YO{~1gM`lR;Pt!v$h~M zHsD4P;7a}9Gg3b#UD5>Vx2y5!w=LR&z<-)!i@zQI(;UA%_LpV;M90=R`;)BxB&$Es z@u%H~HGP;j-kSJ;j?1U!QV;TS?KrFv3}OMZtv%Rm2ZJZ}CO=1Q z_%9fASCfSW8F7jAzcN1y@4XicQh9(IIkZ{8H4V_AowfC zMnm>QZE>XL9%nmk3809p@SAliQTLk}`SRt)sB*uNbCEIHx3R>yy>h(Yl!ZEXu@}4{ zHaZU7m4xOoSC$w6H5+AQ2GQ;DF8yj8Bv~ba-!H%c`>ljI{BRmOngSaiKOM5Wm(nNx ziep2-tjK|zRHk+FW&tW~nE#{>3UVQ|4i+As}Xcp#RC_ zb%!BkvITzcdzb=nWevu`s6`I?6)yo+m$mlSs*`U70M0_E^LkRZnDext z)mrp6WuGx5a3?&ydUeGqHl|OzTh^iRR_YyERe-+gtkFDtIP^TQrMmx#x=b&?%Z8wL zo3YZVM3hflrStN_aLTap_?vdC3ZH|D?!5q4g6@1L(Q^)9b^?S4xJn-^N*C<`?)Pr! zt`j}^BBQQ(O}E04gAXgu9?A(%FcjddPh(V0LsUzSPdq&2cS2u2Ko~XllJgMq83%Ti zD*16*LE+fX%(a#$qS$w4KJ6?Nky#$jAAkFJzj0Ix6wRA-g^E!z#LZFMsvD%{sVKM4 zL%^lt&5izxUvclA2*XTGFHx6f+hJZx3FS#Ww~rY517v?6(z#z=t`>t}kqqKI2WM^t z!0K1Qs9;nLOs51cibG`-?|`Q{h5aKe{Qz!I6unGreC;%p0u^~o2vZRr98sSPY(wv`$AycXUG*?+oBp;;B+UNbA? zv-cx@{}Q&~4t*L_(YUaOt#<)~iClL$(A^KN%(cL;i1mR_q)Xy&TnfH;$h^g6{_Wl6#RkMP^&ie;S z)p=*S5Pub!uK*!2)Jm5U!nsk6^As|h?cdsYUmS@kl1NTmWYuJ}3~`L{$`H=8AYEHT zk8Wsq)5BN8J{Vp0Gh3~{;R1FyxDj|3lZ;W8QyEMXEb+#+KM+u+EQE3wBqdp8mNe&n zF-aA4bdJ@HY>yH1Y07E;^#0+CDgG?)dWUqG+BdO1yLgGp@frgbyjsKr+Yu6EQxqYLw4L|3|zUV>bGr9F1A znYpt>`gP;0#JNQe>xkq}xzxDij%SGM5br=i8kBzf2F=85G-tuZ)6>4~_4&vE zWeN|mZ0hA8vt04^!kqCrQ34@mqNXmM%UEck%#Fh(%EZ>4WW6-5x+|E_P8<6HME(O1 z-Nz$zO(h?5TZy+=yxYA?0g-({ADJ_coOaBaW$sUA4k&&)DU5Ec_~`pWF+nA=P>scy zwav|P+AfzVBY#HDgNUvV#XUt$Lp;?)V%RX1i#-UM9dprkT5mpRT2s(dAf{PSNkzDj z{O`bgv9C@gUPm7*2`?PwXnxoms3BxkxS}dl^Mz*SB}8JPB(0MdcGP!>znNpwyMcYt!z3_OF$25V%J1q`xuz5OJzA!a8j>-9&(I`QS$k0&+ahW=qL9DyzJT`TpEmzz+Tl@bN6`%?kb@oYim+H$qP^wY?U@7bq!9X* zw0*3lm))#VsoV3RHAPK^IRQNUbqDS0R&SZ>Fa{|HOja!r0UMKJFiC}7K3a)_7P;KE z=#}$T&_r-2PP@|)C-KgQbDvcE>W*yt9?#JZjAYnbvuwTGy64_gzSdTdI)CT#5`EjZ zcDfZWX2|i)XYIFlBq8_)?{}7P6NapKNxKnfs*=if!;OfzHbv6s}PRxAUt<%&CLVhto}jmL&6(wYj<;P=)~9nJJYy_mrRdU)i@H`9s|Va+g>XK z&~xSBXzxr!^*eYD$I0WLGUxlFImjuCwSP=Qld37)Ojq?M^HehxIWv=XF&vStOwVQcnoPQx2q7oJA3j9D0y%6=<^D_95ZJXLWK1|6{dG(nsymDS!Cf8 z9~IwGHJ(O*s3p!&V>_C2`?<6TzE-iNV(c(6A?$Z%Tl-?P2H0^M&iFRJ92!^>H}Nrq zjOo#0cK5o1tR0uCrEvzi+}YiHD6e99o-KwEpF*xc=p)= zY5y!47Zbw5yv`;+AVow2(58g(i(_^~XrwpBs^+-y7w6T3x|BTHRR0}U@d#qY(|mN>Udbchc444Z$*>*>E5ck-Zmpi1*tcbV*} zxMHe;1-TPf2><#t(e+)lS840a1NiI~x3eiFjd>?L!_Z>_ol_D8gC&fbB`sZHRZ6)fv`00UYqONR zM?L~b9aW^yMRL48N)q>Gbyrxz`iY1HtYCi zFCX1wy8pDKo5>75fW0@nNqv4iaN2iV`?aqeYmzETe)WiWPR$2WSxBkft7zwsCZ@^{ zg|=A4@h+M0)fzoUi3MSeX@i4<+O!(ea|ePcB114XSS50DYOu~%`J6=qRKOeOIC%DU z!0rv>Ilwnber%!-$UO0#!!D(j16a6+hliu1qphv2>g$XK4)Daei!I@s^H28!@G3h` WX

+

递归过程可分为“递”和“归”两个相反的部分。“递”表示开启新方法,程序在此过程中访问下一个节点;“归”表示函数返回,代表该节点已经访问完毕。如下图所示,为前序遍历二叉树的递归过程。

+
+
+
+

preorder_step1

+
+
+

preorder_step2

+
+
+

preorder_step3

+
+
+

preorder_step4

+
+
+

preorder_step5

+
+
+

preorder_step6

+
+
+

preorder_step7

+
+
+

preorder_step8

+
+
+

preorder_step9

+
+
+

preorder_step10

+
+
+

preorder_step11

+
+

复杂度分析

时间复杂度:所有节点被访问一次,使用 \(O(n)\) 时间,其中 \(n\) 为节点数量。

diff --git a/search/search_index.json b/search/search_index.json index e4070238b..c57918a2f 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["ja"],"separator":"[\\s\\-\uff0c\u3002]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"Home","text":"

\u300a Hello \u7b97\u6cd5 \u300b

\u52a8\u753b\u56fe\u89e3\u3001\u80fd\u8fd0\u884c\u3001\u53ef\u63d0\u95ee\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5feb\u901f\u5165\u95e8\u6559\u7a0b

@Krahets

\u63a8\u8350\u8bed

Quote

\u201c\u4e00\u672c\u901a\u4fd7\u6613\u61c2\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5165\u95e8\u4e66\uff0c\u5f15\u5bfc\u8bfb\u8005\u624b\u8111\u5e76\u7528\u5730\u5b66\u4e60\uff0c\u5f3a\u70c8\u63a8\u8350\u7b97\u6cd5\u521d\u5b66\u8005\u9605\u8bfb\u3002\u201d

\u2014\u2014 \u9093\u4fca\u8f89\uff0c\u6e05\u534e\u5927\u5b66\u8ba1\u7b97\u673a\u7cfb\u6559\u6388

Quote

\u201c\u5982\u679c\u6211\u5f53\u5e74\u5b66\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u65f6\u5019\u6709\u300aHello \u7b97\u6cd5\u300b\uff0c\u5b66\u8d77\u6765\u5e94\u8be5\u4f1a\u7b80\u5355 10 \u500d\uff01\u201d

\u2014\u2014 \u674e\u6c90\uff0c\u4e9a\u9a6c\u900a\u8d44\u6df1\u9996\u5e2d\u79d1\u5b66\u5bb6

\u300c\u5168\u4e66\u52a8\u753b\u56fe\u89e3\u300d

\u5185\u5bb9\u6e05\u6670\u6613\u61c2\u3001\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\u7535\u8111\u3001\u5e73\u677f\u3001\u624b\u673a\u5168\u7ec8\u7aef\u9605\u8bfb

\"A picture is worth a thousand words.\"

\u201c\u4e00\u56fe\u80dc\u5343\u8a00\u201d

\u300c\u4ee3\u7801\u4e00\u952e\u8fd0\u884c\u300d

\u63d0\u4f9b\u5404\u4e2a\u7b97\u6cd5\u4e0e\u6570\u636e\u7ed3\u6784\u7684\u7b80\u6d01\u5b9e\u73b0\u4e0e\u6d4b\u8bd5\u6837\u4f8b\uff0c\u7686\u53ef\u76f4\u63a5\u8fd0\u884c\u652f\u6301 Java, C++, Python, Go, JS, TS, C#, Swift, Zig \u7b49\u8bed\u8a00

\"Talk is cheap. Show me the code.\"

\u201c\u5c11\u5439\u725b\uff0c\u770b\u4ee3\u7801\u201d

\u300c\u53ef\u8ba8\u8bba\u4e0e\u63d0\u95ee\u300d

\u9f13\u52b1\u5c0f\u4f19\u4f34\u4eec\u4e92\u5e2e\u4e92\u52a9\u3001\u5171\u540c\u6210\u957f\u63d0\u95ee\u4e0e\u8bc4\u8bba\u4e00\u822c\u80fd\u5728\u4e24\u65e5\u5185\u5f97\u5230\u56de\u590d

\u201c\u8ffd\u98ce\u8d76\u6708\u83ab\u505c\u7559\uff0c\u5e73\u829c\u5c3d\u5904\u662f\u6625\u5c71\u201d

\u4e00\u8d77\u52a0\u6cb9\uff01

\u5e8f

\u4e24\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u300a\u5251\u6307 Offer\u300b\u7cfb\u5217\u9898\u89e3\uff0c\u53d7\u5230\u4e86\u8bb8\u591a\u670b\u53cb\u7684\u559c\u7231\u4e0e\u652f\u6301\u3002\u5728\u6b64\u671f\u95f4\uff0c\u6211\u56de\u7b54\u4e86\u4f17\u591a\u8bfb\u8005\u7684\u8bc4\u8bba\u95ee\u9898\uff0c\u5176\u4e2d\u6700\u5e38\u89c1\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u201c\u5982\u4f55\u5165\u95e8\u5b66\u4e60\u7b97\u6cd5\u201d\u3002\u6211\u9010\u6e10\u4e5f\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\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\uff0c\u5237\u9898\u5c31\u5982\u540c\u73a9\u201c\u626b\u96f7\u201d\u6e38\u620f\uff0c\u81ea\u5b66\u80fd\u529b\u5f3a\u7684\u540c\u5b66\u80fd\u591f\u987a\u5229\u5730\u5c06\u5730\u96f7\u9010\u4e2a\u6392\u6389\uff0c\u800c\u57fa\u7840\u4e0d\u8db3\u7684\u540c\u5b66\u5f88\u53ef\u80fd\u88ab\u70b8\u7684\u6ee1\u5934\u662f\u5305\uff0c\u5e76\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7f29\u3002\u901a\u8bfb\u6559\u6750\u4e66\u7c4d\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u505a\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u9762\u5411\u6c42\u804c\u7684\u540c\u5b66\u6765\u8bf4\uff0c\u6bd5\u4e1a\u5b63\u3001\u6295\u9012\u7b80\u5386\u3001\u51c6\u5907\u7b14\u8bd5\u9762\u8bd5\u5df2\u7ecf\u5360\u636e\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u539a\u91cd\u7684\u4e66\u7c4d\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\u627e\u5230\u4e86\u4f60\u3002\u672c\u4e66\u662f\u6211\u5bf9\u6b64\u95ee\u9898\u7684\u7ed9\u51fa\u7684\u7b54\u6848\uff0c\u867d\u7136\u4e0d\u4e00\u5b9a\u6b63\u786e\uff0c\u4f46\u81f3\u5c11\u662f\u4e00\u6b21\u79ef\u6781\u7684\u5c1d\u8bd5\u3002\u8fd9\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\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\u5e94\u5bf9\u5237\u9898\u548c\u9605\u8bfb\u6587\u732e\uff0c\u9010\u6b65\u6784\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8bc6\u4f53\u7cfb\u3002

\u4f5c\u8005\u7b80\u4ecb

\u9773\u5b87\u680b (Krahets)\uff0c\u5927\u5382\u9ad8\u7ea7\u7b97\u6cd5\u5de5\u7a0b\u5e08\uff0c\u4e0a\u6d77\u4ea4\u901a\u5927\u5b66\u7855\u58eb\u3002\u529b\u6263\uff08LeetCode\uff09\u5168\u7f51\u9605\u8bfb\u91cf\u6700\u9ad8\u535a\u4e3b\uff0c\u5176 LeetBook\u300a\u56fe\u89e3\u7b97\u6cd5\u6570\u636e\u7ed3\u6784\u300b\u5df2\u88ab\u8ba2\u9605 22 \u4e07\u672c\u3002

\u81f4\u8c22

\u672c\u4e66\u5728\u5f00\u6e90\u793e\u533a\u4f17\u591a\u8d21\u732e\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65ad\u6210\u957f\u3002\u611f\u8c22\u6bcf\u4e00\u4f4d\u6295\u5165\u65f6\u95f4\u4e0e\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u662f\u4ed6\u4eec\u65e0\u79c1\u5949\u732e\u4f7f\u8fd9\u672c\u4e66\u8d8a\u53d8\u8d8a\u597d\uff0c\u4ed6\u4eec\u662f\uff08\u6309\u7167 GitHub \u81ea\u52a8\u751f\u6210\u7684\u987a\u5e8f\uff09\uff1a

\u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 justin\u2010tse, krahets, nuomi1, Reanon, sjinzh \u5b8c\u6210\uff0c\u611f\u8c22\u4ed6\u4eec\u7684\u8f9b\u52e4\u4ed8\u51fa\uff01

justin-tseJS / TS krahetsJava / Python nuomi1Swift ReanonGo / C sjinzhRust / Zig"},{"location":"chapter_appendix/contribution/","title":"14.2. \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c","text":"

\u5f00\u6e90\u7684\u9b45\u529b

\u7eb8\u8d28\u4e66\u7c4d\u7684\u4e24\u6b21\u5370\u5237\u7684\u95f4\u9694\u65f6\u95f4\u5f80\u5f80\u9700\u8981\u6570\u5e74\uff0c\u5185\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002\u4f46\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

\u7531\u4e8e\u4f5c\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\u5931\u6548\u94fe\u63a5\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\u5e2e\u52a9\u5176\u4ed6\u8bfb\u8005\u83b7\u5f97\u66f4\u4f18\u8d28\u7684\u5b66\u4e60\u8d44\u6e90\u3002\u6240\u6709\u64b0\u7a3f\u4eba\u5c06\u5728\u4ed3\u5e93\u548c\u7f51\u7ad9\u4e3b\u9875\u4e0a\u5c55\u793a\uff0c\u4ee5\u611f\u8c22\u4ed6\u4eec\u5bf9\u5f00\u6e90\u793e\u533a\u7684\u65e0\u79c1\u5949\u732e\uff01

"},{"location":"chapter_appendix/contribution/#1421","title":"14.2.1. \u00a0 \u5185\u5bb9\u5fae\u8c03","text":"

\u5728\u6bcf\u4e2a\u9875\u9762\u7684\u53f3\u4e0a\u89d2\u6709\u4e00\u4e2a\u300c\u7f16\u8f91\u300d\u56fe\u6807\uff0c\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u4fee\u6539\u6587\u672c\u6216\u4ee3\u7801\uff1a

  1. \u70b9\u51fb\u7f16\u8f91\u6309\u94ae\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u4ed3\u5e93\u201d\u7684\u63d0\u793a\uff0c\u8bf7\u540c\u610f\u8be5\u64cd\u4f5c\uff1b
  2. \u4fee\u6539 Markdown \u6e90\u6587\u4ef6\u5185\u5bb9\uff0c\u5e76\u786e\u4fdd\u5185\u5bb9\u6b63\u786e\uff0c\u540c\u65f6\u5c3d\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7edf\u4e00\uff1b
  3. \u5728\u9875\u9762\u5e95\u90e8\u586b\u5199\u4fee\u6539\u8bf4\u660e\uff0c\u7136\u540e\u70b9\u51fb\u201cPropose file change\u201d\u6309\u94ae\uff1b\u9875\u9762\u8df3\u8f6c\u540e\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002

Fig. \u9875\u9762\u7f16\u8f91\u6309\u952e

\u7531\u4e8e\u56fe\u7247\u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u56e0\u6b64\u9700\u8981\u901a\u8fc7\u65b0\u5efa Issue \u6216\u8bc4\u8bba\u7559\u8a00\u6765\u63cf\u8ff0\u56fe\u7247\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5c3d\u5feb\u91cd\u65b0\u7ed8\u5236\u5e76\u66ff\u6362\u56fe\u7247\u3002

"},{"location":"chapter_appendix/contribution/#1422","title":"14.2.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 Pull Request \u5de5\u4f5c\u6d41\u7a0b\uff1a

  1. \u767b\u5f55 GitHub \uff0c\u5c06\u672c\u4ed3\u5e93 Fork \u5230\u4e2a\u4eba\u8d26\u53f7\u4e0b\uff1b
  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\uff1b
  3. \u5728\u672c\u5730\u8fdb\u884c\u5185\u5bb9\u521b\u4f5c\uff0c\u5e76\u901a\u8fc7\u8fd0\u884c\u6d4b\u8bd5\u4ee5\u9a8c\u8bc1\u4ee3\u7801\u7684\u6b63\u786e\u6027\uff1b
  4. \u5c06\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u540e Push \u81f3\u8fdc\u7a0b\u4ed3\u5e93\uff1b
  5. \u5237\u65b0\u4ed3\u5e93\u7f51\u9875\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\uff1b
"},{"location":"chapter_appendix/contribution/#1423-docker","title":"14.2.3. \u00a0 Docker \u90e8\u7f72","text":"

\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 Docker \u6765\u90e8\u7f72\u672c\u9879\u76ee\u3002\u6267\u884c\u4ee5\u4e0b\u811a\u672c\uff0c\u7a0d\u7b49\u7247\u523b\u540e\uff0c\u5373\u53ef\u4f7f\u7528\u6d4f\u89c8\u5668\u6253\u5f00 http://localhost:8000 \u6765\u8bbf\u95ee\u672c\u9879\u76ee\u3002

git clone https://github.com/krahets/hello-algo.git\ncd hello-algo\ndocker-compose up -d\n

\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u5220\u9664\u90e8\u7f72\u3002

docker-compose down\n
"},{"location":"chapter_appendix/installation/","title":"14.1. \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1411-vscode","title":"14.1.1. \u00a0 VSCode","text":"

\u672c\u4e66\u63a8\u8350\u4f7f\u7528\u5f00\u6e90\u8f7b\u91cf\u7684 VSCode \u4f5c\u4e3a\u672c\u5730 IDE \uff0c\u4e0b\u8f7d\u5e76\u5b89\u88c5 VSCode \u3002

"},{"location":"chapter_appendix/installation/#1412-java","title":"14.1.2. \u00a0 Java \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 OpenJDK\uff08\u7248\u672c\u9700\u6ee1\u8db3 > JDK 9\uff09\u3002
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88c5 Extension Pack for Java \u3002
"},{"location":"chapter_appendix/installation/#1413-cc","title":"14.1.3. \u00a0 C/C++ \u73af\u5883","text":"
  1. Windows \u7cfb\u7edf\u9700\u8981\u5b89\u88c5 MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff0cMacOS \u81ea\u5e26 Clang \u65e0\u9700\u5b89\u88c5\u3002
  2. \u5728 VSCode \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/#1414-python","title":"14.1.4. \u00a0 Python \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Miniconda3 \u3002
  2. \u5728 VSCode \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/#1415-go","title":"14.1.5. \u00a0 Go \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 go \u3002
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88c5 Go \u3002
  3. \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/#1416-javascript","title":"14.1.6. \u00a0 JavaScript \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 node.js \u3002
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 javascript \uff0c\u5b89\u88c5 JavaScript (ES6) code snippets \u3002
  3. \uff08\u53ef\u9009\uff09\u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#1417-c","title":"14.1.7. \u00a0 C# \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 .Net 6.0 \uff1b
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 c# \uff0c\u5b89\u88c5 c# \u3002
"},{"location":"chapter_appendix/installation/#1418-swift","title":"14.1.8. \u00a0 Swift \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Swift\uff1b
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88c5 Swift for Visual Studio Code\u3002
"},{"location":"chapter_appendix/installation/#1419-rust","title":"14.1.9. \u00a0 Rust \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Rust\uff1b
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88c5 rust-analyzer\u3002
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1. \u00a0 \u6570\u7ec4","text":"

\u300c\u6570\u7ec4 Array\u300d\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5c06\u76f8\u540c\u7c7b\u578b\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\u5143\u7d20\u7684\u300c\u7d22\u5f15 Index\u300d\u3002

Fig. \u6570\u7ec4\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

\u6570\u7ec4\u521d\u59cb\u5316\u3002\u901a\u5e38\u6709\u65e0\u521d\u59cb\u503c\u548c\u7ed9\u5b9a\u521d\u59cb\u503c\u4e24\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u53ef\u6839\u636e\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\u3002\u5728\u672a\u7ed9\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u51b5\u4e0b\uff0c\u6570\u7ec4\u7684\u6240\u6709\u5143\u7d20\u901a\u5e38\u4f1a\u88ab\u521d\u59cb\u5316\u4e3a\u9ed8\u8ba4\u503c \\(0\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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.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\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
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.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.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.c
int arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 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.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.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
"},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1. \u00a0 \u6570\u7ec4\u4f18\u70b9","text":"

\u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5143\u7d20\u975e\u5e38\u9ad8\u6548\u3002\u7531\u4e8e\u6570\u7ec4\u5143\u7d20\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u56e0\u6b64\u8ba1\u7b97\u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7ed9\u5b9a\u6570\u7ec4\u9996\u4e2a\u5143\u7d20\u7684\u5730\u5740\u548c\u67d0\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u5f97\u5230\u8be5\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u76f4\u63a5\u8bbf\u95ee\u6b64\u5143\u7d20\u3002

Fig. \u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u8ba1\u7b97

# \u5143\u7d20\u5185\u5b58\u5730\u5740 = \u6570\u7ec4\u5185\u5b58\u5730\u5740 + \u5143\u7d20\u957f\u5ea6 * \u5143\u7d20\u7d22\u5f15\nelementAddr = firtstElementAddr + elementLength * elementIndex\n

\u4e3a\u4ec0\u4e48\u6570\u7ec4\u5143\u7d20\u7684\u7d22\u5f15\u8981\u4ece \\(0\\) \u5f00\u59cb\u7f16\u53f7\u5462\uff1f

\u89c2\u5bdf\u4e0a\u56fe\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

\u7136\u800c\uff0c\u4ece\u5730\u5740\u8ba1\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8d28\u4e0a\u8868\u793a\u7684\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\u7d22\u5f15\u4e3a \\(0\\) \u4e5f\u662f\u5408\u7406\u7684\u3002

\u8bbf\u95ee\u5143\u7d20\u7684\u9ad8\u6548\u6027\u5e26\u6765\u4e86\u8bf8\u591a\u4fbf\u5229\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u968f\u673a\u83b7\u53d6\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u5143\u7d20\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int[] nums) {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
array.cpp
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n// \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = rand() % size;\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
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\nrandom_index = random.randint(0, len(nums) - 1)\n# \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nrandom_num = nums[random_index]\nreturn random_num\n
array.go
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nrandomIndex := rand.Intn(len(nums))\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nrandomNum = nums[randomIndex]\nreturn\n}\n
array.js
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunction randomAccess(nums) {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nconst random_index = Math.floor(Math.random() * nums.length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nconst random_num = nums[random_index];\nreturn random_num;\n}\n
array.ts
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nconst random_index = Math.floor(Math.random() * nums.length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nconst random_num = nums[random_index];\nreturn random_num;\n}\n
array.c
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n// \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = rand() % size;\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
array.cs
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int[] nums)\n{\nRandom random = new();\n// \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = random.Next(nums.Length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
array.swift
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n// \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nlet randomIndex = nums.indices.randomElement()!\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nlet randomNum = nums[randomIndex]\nreturn randomNum\n}\n
array.zig
// \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n// \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\nvar randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nvar randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
"},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2. \u00a0 \u6570\u7ec4\u7f3a\u70b9","text":"

\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u7531\u4e8e\u7cfb\u7edf\u65e0\u6cd5\u4fdd\u8bc1\u6570\u7ec4\u4e4b\u540e\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u53ef\u7528\u7684\uff0c\u56e0\u6b64\u6570\u7ec4\u957f\u5ea6\u65e0\u6cd5\u6269\u5c55\u3002\u800c\u82e5\u5e0c\u671b\u6269\u5bb9\u6570\u7ec4\uff0c\u5219\u9700\u65b0\u5efa\u4e00\u4e2a\u6570\u7ec4\uff0c\u7136\u540e\u628a\u539f\u6570\u7ec4\u5143\u7d20\u4f9d\u6b21\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\uff0c\u5728\u6570\u7ec4\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u8fd9\u662f\u975e\u5e38\u8017\u65f6\u7684\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint[] res = new int[nums.length + enlarge];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < nums.length; i++) {\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\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\nint *res = new int[size + enlarge];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\nres[i] = nums[i];\n}\n// \u91ca\u653e\u5185\u5b58\ndelete[] nums;\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\n
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\nres = [0] * (len(nums) + enlarge)\n# \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor i in range(len(nums)):\nres[i] = nums[i]\n# \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res\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\nres := make([]int, len(nums)+enlarge)\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor i, num := range nums {\nres[i] = num\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\u662f\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\nconst 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\nfor (let i = 0; i < nums.length; i++) {\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\u662f\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\nconst 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\nfor (let i = 0; i < nums.length; i++) {\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\nint *res = (int *)malloc(sizeof(int) * (size + enlarge));\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\nres[i] = nums[i];\n}\n// \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\nfor (int i = size; i < size + enlarge; i++) {\nres[i] = 0;\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\n
array.cs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge)\n{\n// \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\nint[] res = new int[nums.Length + enlarge];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < nums.Length; i++)\n{\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\nvar 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\nfor i in nums.indices {\nres[i] = nums[i]\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res\n}\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\nvar res = try mem_allocator.alloc(i32, nums.len + enlarge);\nstd.mem.set(i32, res, 0);\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nstd.mem.copy(i32, res, nums);\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\n

\u6570\u7ec4\u4e2d\u63d2\u5165\u6216\u5220\u9664\u5143\u7d20\u6548\u7387\u4f4e\u4e0b\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\u5728\u6570\u7ec4\u4e2d\u95f4\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\uff0c\u7531\u4e8e\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\u653e\u4efb\u4f55\u6570\u636e\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4e0d\u5f97\u4e0d\u5c06\u6b64\u7d22\u5f15\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u518d\u628a\u5143\u7d20\u8d4b\u503c\u7ed9\u8be5\u7d22\u5f15\u3002

Fig. \u6570\u7ec4\u63d2\u5165\u5143\u7d20

JavaC++PythonGoJavaScriptTypeScriptCC#Swift 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\nfor (int i = nums.length - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num;\n}\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\nfor (int i = size - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num;\n}\n
array.py
def insert(nums: list[int], num: int, index: int) -> None:\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\nfor i in range(len(nums) - 1, index, -1):\nnums[i] = nums[i - 1]\n# \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num\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\nfor i := len(nums) - 1; i > index; i-- {\nnums[i] = nums[i-1]\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor (let i = nums.length - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor (let i = nums.length - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor (int i = size - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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{\n// \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int i = nums.Length - 1; i > index; i--)\n{\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor i in sequence(first: nums.count - 1, next: { $0 > index + 1 ? $0 - 1 : nil }) {\nnums[i] = nums[i - 1]\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num\n}\n

\u5220\u9664\u5143\u7d20\u4e5f\u7c7b\u4f3c\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\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\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5220\u9664\u5143\u7d20\u540e\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u53d8\u5f97\u201c\u65e0\u610f\u4e49\u201d\u4e86\uff0c\u6211\u4eec\u65e0\u9700\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

Fig. \u6570\u7ec4\u5220\u9664\u5143\u7d20

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (int i = index; i < nums.length - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.cpp
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (int i = index; i < size - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.py
def remove(nums: list[int], index: int) -> None:\n\"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20\"\"\"\n# \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor i in range(index, len(nums) - 1):\nnums[i] = nums[i + 1]\n
array.go
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor i := index; i < len(nums)-1; i++ {\nnums[i] = nums[i+1]\n}\n}\n
array.js
/* \u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20 */\nfunction remove(nums, index) {\n// \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (let i = index; i < nums.length - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.ts
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (let i = index; i < nums.length - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.c
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (int i = index; i < size - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.cs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20 */\nvoid remove(int[] nums, int index)\n{\n// \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int i = index; i < nums.Length - 1; i++)\n{\nnums[i] = nums[i + 1];\n}\n}\n
array.swift
/* \u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\nlet count = nums.count\n// \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor i in sequence(first: index, next: { $0 < count - 1 - 1 ? $0 + 1 : nil }) {\nnums[i] = nums[i + 1]\n}\n}\n
array.zig
// \u5220\u9664\u7d22\u5f15 index \u5904\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\nvar i = index;\nwhile (i < nums.len - 1) : (i += 1) {\nnums[i] = nums[i + 1];\n}\n}\n

\u603b\u7ed3\u6765\u770b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u70b9\uff1a

  • \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\u6211\u4eec\u4e0d\u5173\u5fc3\u7684\uff0c\u4f46\u8fd9\u6837\u505a\u540c\u65f6\u4e5f\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u7684\u6d6a\u8d39\u3002
"},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3. \u00a0 \u6570\u7ec4\u5e38\u7528\u64cd\u4f5c","text":"

\u6570\u7ec4\u904d\u5386\u3002\u4ee5\u4e0b\u4ecb\u7ecd\u4e24\u79cd\u5e38\u7528\u7684\u904d\u5386\u65b9\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < nums.length; i++) {\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (int num : nums) {\ncount++;\n}\n}\n
array.cpp
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\ncount++;\n}\n}\n
array.py
def traverse(nums: list[int]) -> None:\n\"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\ncount = 0\n# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor i in range(len(nums)):\ncount += 1\n# \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor num in nums:\ncount += 1\n
array.go
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\ncount := 0\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor i := 0; i < len(nums); i++ {\ncount++\n}\ncount = 0\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor range nums {\ncount++\n}\n}\n
array.js
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\nlet count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (let num of nums) {\ncount += 1;\n}\n}\n
array.ts
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\nlet count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (let num of nums) {\ncount += 1;\n}\n}\n
array.c
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\ncount++;\n}\n}\n
array.cs
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums)\n{\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < nums.Length; i++)\n{\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nforeach (int num in nums)\n{\ncount++;\n}\n}\n
array.swift
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\nvar count = 0\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor _ in nums.indices {\ncount += 1\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor _ in nums {\ncount += 1\n}\n}\n
array.zig
// \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\nvar count: i32 = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nvar i: i32 = 0;\nwhile (i < nums.len) : (i += 1) {\ncount += 1;\n}\ncount = 0;\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (nums) |_| {\ncount += 1;\n}\n}\n

\u6570\u7ec4\u67e5\u627e\u3002\u901a\u8fc7\u904d\u5386\u6570\u7ec4\uff0c\u67e5\u627e\u6570\u7ec4\u5185\u7684\u6307\u5b9a\u5143\u7d20\uff0c\u5e76\u8f93\u51fa\u5bf9\u5e94\u7d22\u5f15\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\nfor (int i = 0; i < nums.length; i++) {\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.cpp
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\nfor (int i = 0; i < size; i++) {\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.py
def find(nums: list[int], target: int) -> int:\n\"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\nfor i in range(len(nums)):\nif nums[i] == target:\nreturn i\nreturn -1\n
array.go
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\nindex = -1\nfor i := 0; i < len(nums); i++ {\nif nums[i] == target {\nindex = i\nbreak\n}\n}\nreturn\n}\n
array.js
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\nfor (let i = 0; i < nums.length; i++) {\nif (nums[i] == target) return i;\n}\nreturn -1;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\nfor (let i = 0; i < nums.length; i++) {\nif (nums[i] === target) {\nreturn i;\n}\n}\nreturn -1;\n}\n
array.c
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\nfor (int i = 0; i < size; i++) {\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target)\n{\nfor (int i = 0; i < nums.Length; i++)\n{\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.swift
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\nfor i in nums.indices {\nif nums[i] == target {\nreturn i\n}\n}\nreturn -1\n}\n
array.zig
// \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\nfor (nums) |num, i| {\nif (num == target) return @intCast(i32, i);\n}\nreturn -1;\n}\n
"},{"location":"chapter_array_and_linkedlist/array/#414","title":"4.1.4. \u00a0 \u6570\u7ec4\u5178\u578b\u5e94\u7528","text":"

\u968f\u673a\u8bbf\u95ee\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\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\u6837\u672c\u7684\u968f\u673a\u62bd\u53d6\u3002

\u4e8c\u5206\u67e5\u627e\u3002\u4f8b\u5982\u524d\u6587\u67e5\u5b57\u5178\u7684\u4f8b\u5b50\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u5178\u4e2d\u7684\u6240\u6709\u5b57\u6309\u7167\u62fc\u97f3\u987a\u5e8f\u5b58\u50a8\u5728\u6570\u7ec4\u4e2d\uff0c\u7136\u540e\u4f7f\u7528\u4e0e\u65e5\u5e38\u67e5\u7eb8\u8d28\u5b57\u5178\u76f8\u540c\u7684\u201c\u7ffb\u5f00\u4e2d\u95f4\uff0c\u6392\u9664\u4e00\u534a\u201d\u7684\u65b9\u5f0f\uff0c\u6765\u5b9e\u73b0\u4e00\u4e2a\u67e5\u7535\u5b50\u5b57\u5178\u7684\u7b97\u6cd5\u3002

\u6df1\u5ea6\u5b66\u4e60\u3002\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

"},{"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\u6392\u9664\u5df2\u88ab\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u7a7a\u95f2\u5185\u5b58\u7a7a\u95f4\u901a\u5e38\u6563\u843d\u5728\u5185\u5b58\u5404\u5904\u3002\u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u5b58\u50a8\u6570\u7ec4\u7684\u5185\u5b58\u7a7a\u95f4\u5fc5\u987b\u662f\u8fde\u7eed\u7684\uff0c\u800c\u5f53\u6211\u4eec\u9700\u8981\u7533\u8bf7\u4e00\u4e2a\u975e\u5e38\u5927\u7684\u6570\u7ec4\u65f6\uff0c\u7a7a\u95f2\u5185\u5b58\u4e2d\u53ef\u80fd\u6ca1\u6709\u8fd9\u4e48\u5927\u7684\u8fde\u7eed\u7a7a\u95f4\u3002\u4e0e\u6570\u7ec4\u76f8\u6bd4\uff0c\u94fe\u8868\u66f4\u5177\u7075\u6d3b\u6027\uff0c\u5b83\u53ef\u4ee5\u88ab\u5b58\u50a8\u5728\u975e\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002

\u300c\u94fe\u8868 Linked List\u300d\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u5404\u4e2a\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u8fde\u63a5\uff0c\u4ece\u5f53\u524d\u8282\u70b9\u901a\u8fc7\u6307\u9488\u53ef\u4ee5\u8bbf\u95ee\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002\u7531\u4e8e\u6307\u9488\u8bb0\u5f55\u4e86\u4e0b\u4e2a\u8282\u70b9\u7684\u5185\u5b58\u5730\u5740\uff0c\u56e0\u6b64\u65e0\u9700\u4fdd\u8bc1\u5185\u5b58\u5730\u5740\u7684\u8fde\u7eed\u6027\uff0c\u4ece\u800c\u53ef\u4ee5\u5c06\u5404\u4e2a\u8282\u70b9\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\u3002

\u94fe\u8868\u300c\u8282\u70b9 Node\u300d\u5305\u542b\u4e24\u9879\u6570\u636e\uff0c\u4e00\u662f\u8282\u70b9\u300c\u503c Value\u300d\uff0c\u4e8c\u662f\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u300c\u6307\u9488 Pointer\u300d\uff0c\u6216\u79f0\u300c\u5f15\u7528 Reference\u300d\u3002

Fig. \u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nint val;        // \u8282\u70b9\u503c\nListNode next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;         // \u8282\u70b9\u503c\nListNode *next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) : val(x), next(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
class ListNode:\n\"\"\"\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                  # \u8282\u70b9\u503c\nself.next: Optional[ListNode] = None # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype ListNode struct {\nVal  int       // \u8282\u70b9\u503c\nNext *ListNode // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n// NewListNode \u6784\u9020\u51fd\u6570\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u94fe\u8868\nfunc NewListNode(val int) *ListNode {\nreturn &ListNode{\nVal:  val,\nNext: nil,\n}\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval;\nnext;\nconstructor(val, next) {\nthis.val = (val === undefined ? 0 : val);       // \u8282\u70b9\u503c\nthis.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval: number;\nnext: ListNode | null;\nconstructor(val?: number, next?: ListNode | null) {\nthis.val = val === undefined ? 0 : val;        // \u8282\u70b9\u503c\nthis.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;               // \u8282\u70b9\u503c\nstruct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n};\ntypedef struct ListNode ListNode;\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\nListNode *node, *next;\nnode = (ListNode *) malloc(sizeof(ListNode));\nnode->val = val;\nnode->next = NULL;\nreturn node;\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode\n{\nint val;         // \u8282\u70b9\u503c\nListNode next;   // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\nListNode(int x) => val = x;  //\u6784\u9020\u51fd\u6570\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nvar val: Int // \u8282\u70b9\u503c\nvar next: ListNode? // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\ninit(x: Int) { // \u6784\u9020\u51fd\u6570\nval = x\n}\n}\n
// \u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nval: T = 0, // \u8282\u70b9\u503c\nnext: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n// \u6784\u9020\u51fd\u6570\npub fn init(self: *Self, x: i32) void {\nself.val = x;\nself.next = null;\n}\n};\n}\n

\u5c3e\u8282\u70b9\u6307\u5411\u4ec0\u4e48\uff1f

\u6211\u4eec\u5c06\u94fe\u8868\u7684\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u79f0\u4e3a\u300c\u5c3e\u8282\u70b9\u300d\uff0c\u5176\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5728 Java, C++, Python \u4e2d\u5206\u522b\u8bb0\u4e3a \\(\\text{null}\\) , \\(\\text{nullptr}\\) , \\(\\text{None}\\) \u3002\u5728\u4e0d\u5f15\u8d77\u6b67\u4e49\u7684\u524d\u63d0\u4e0b\uff0c\u672c\u4e66\u90fd\u4f7f\u7528 \\(\\text{null}\\) \u6765\u8868\u793a\u7a7a\u3002

\u5982\u4f55\u79f0\u547c\u94fe\u8868\uff1f

\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6570\u7ec4\u6574\u4f53\u5c31\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u4f8b\u5982\u6570\u7ec4 nums \uff0c\u5305\u542b\u5404\u4e2a\u5143\u7d20 nums[0] , nums[1] \u7b49\u7b49\u3002\u800c\u94fe\u8868\u662f\u7531\u591a\u4e2a\u8282\u70b9\u5bf9\u8c61\u7ec4\u6210\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u5934\u8282\u70b9\u5f53\u4f5c\u94fe\u8868\u7684\u4ee3\u79f0\uff0c\u4f8b\u5982\u5934\u8282\u70b9 head \u548c\u94fe\u8868 head \u5b9e\u9645\u4e0a\u662f\u540c\u4e49\u7684\u3002

\u94fe\u8868\u521d\u59cb\u5316\u65b9\u6cd5\u3002\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\u5f15\u7528\u6307\u5411\u5173\u7cfb\u3002\u5b8c\u6210\u540e\uff0c\u5373\u53ef\u4ee5\u4ece\u94fe\u8868\u7684\u5934\u8282\u70b9\uff08\u5373\u9996\u4e2a\u8282\u70b9\uff09\u51fa\u53d1\uff0c\u901a\u8fc7\u6307\u9488 next \u4f9d\u6b21\u8bbf\u95ee\u6240\u6709\u8282\u70b9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\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\u5f15\u7528\u6307\u5411\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 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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1. \u00a0 \u94fe\u8868\u4f18\u70b9","text":"

\u94fe\u8868\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u7684\u64cd\u4f5c\u6548\u7387\u9ad8\u3002\u4f8b\u5982\uff0c\u5982\u679c\u6211\u4eec\u60f3\u5728\u94fe\u8868\u4e2d\u95f4\u7684\u4e24\u4e2a\u8282\u70b9 A , B \u4e4b\u95f4\u63d2\u5165\u4e00\u4e2a\u65b0\u8282\u70b9 P \uff0c\u6211\u4eec\u53ea\u9700\u8981\u6539\u53d8\u4e24\u4e2a\u8282\u70b9\u6307\u9488\u5373\u53ef\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1b\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u64cd\u4f5c\u6548\u7387\u8981\u4f4e\u5f97\u591a\u3002

Fig. \u94fe\u8868\u63d2\u5165\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\nListNode n1 = n0.next;\nP.next = n1;\nn0.next = P;\n}\n
linked_list.cpp
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\nListNode *n1 = n0->next;\nP->next = n1;\nn0->next = P;\n}\n
linked_list.py
def insert(n0: ListNode, P: ListNode) -> None:\n\"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\nn1 = n0.next\nP.next = n1\nn0.next = P\n
linked_list.go
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\nn1 := n0.Next\nP.Next = n1\nn0.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) {\nconst n1 = n0.next;\nP.next = n1;\nn0.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 {\nconst n1 = n0.next;\nP.next = n1;\nn0.next = 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) {\nListNode *n1 = n0->next;\nP->next = n1;\nn0->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{\nListNode? n1 = n0.next;\nP.next = n1;\nn0.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) {\nlet n1 = n0.next\nP.next = n1\nn0.next = P\n}\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 {\nvar n1 = n0.?.next;\nP.?.next = n1;\nn0.?.next = P;\n}\n

\u5728\u94fe\u8868\u4e2d\u5220\u9664\u8282\u70b9\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u53d8\u4e00\u4e2a\u8282\u70b9\u7684\u6307\u9488\u5373\u53ef\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5c3d\u7ba1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\uff0c\u8282\u70b9 P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5b9e\u9645\u4e0a P \u5df2\u7ecf\u4e0d\u518d\u5c5e\u4e8e\u6b64\u94fe\u8868\uff0c\u56e0\u4e3a\u904d\u5386\u6b64\u94fe\u8868\u65f6\u65e0\u6cd5\u8bbf\u95ee\u5230 P \u3002

Fig. \u94fe\u8868\u5220\u9664\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\nif (n0.next == null)\nreturn;\n// n0 -> P -> n1\nListNode P = n0.next;\nListNode n1 = P.next;\nn0.next = n1;\n}\n
linked_list.cpp
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\nif (n0->next == nullptr)\nreturn;\n// n0 -> P -> n1\nListNode *P = n0->next;\nListNode *n1 = P->next;\nn0->next = n1;\n// \u91ca\u653e\u5185\u5b58\ndelete P;\n}\n
linked_list.py
def remove(n0: ListNode) -> None:\n\"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\nif not n0.next:\nreturn\n# n0 -> P -> n1\nP = n0.next\nn1 = P.next\nn0.next = n1\n
linked_list.go
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeNode(n0 *ListNode) {\nif n0.Next == nil {\nreturn\n}\n// n0 -> P -> n1\nP := n0.Next\nn1 := P.Next\nn0.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) {\nif (!n0.next) return;\n// n0 -> P -> n1\nconst P = n0.next;\nconst n1 = P.next;\nn0.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 {\nif (!n0.next) {\nreturn;\n}\n// n0 -> P -> n1\nconst P = n0.next;\nconst n1 = P.next;\nn0.next = n1;\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 removeNode(ListNode *n0) {\nif (!n0->next)\nreturn;\n// n0 -> P -> n1\nListNode *P = n0->next;\nListNode *n1 = P->next;\nn0->next = n1;\n// \u91ca\u653e\u5185\u5b58\nfree(P);\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{\nif (n0.next == null)\nreturn;\n// n0 -> P -> n1\nListNode P = n0.next;\nListNode? n1 = P.next;\nn0.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) {\nif n0.next == nil {\nreturn\n}\n// n0 -> P -> n1\nlet P = n0.next\nlet n1 = P?.next\nn0.next = n1\nP?.next = nil\n}\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 {\nif (n0.?.next == null) return;\n// n0 -> P -> n1\nvar P = n0.?.next;\nvar n1 = P.?.next;\nn0.?.next = n1;\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#422","title":"4.2.2. \u00a0 \u94fe\u8868\u7f3a\u70b9","text":"

\u94fe\u8868\u8bbf\u95ee\u8282\u70b9\u6548\u7387\u8f83\u4f4e\u3002\u5982\u4e0a\u8282\u6240\u8ff0\uff0c\u6570\u7ec4\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u4e0b\u8bbf\u95ee\u4efb\u610f\u5143\u7d20\u3002\u7136\u800c\uff0c\u94fe\u8868\u65e0\u6cd5\u76f4\u63a5\u8bbf\u95ee\u4efb\u610f\u8282\u70b9\uff0c\u8fd9\u662f\u56e0\u4e3a\u7cfb\u7edf\u9700\u8981\u4ece\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u9010\u4e2a\u5411\u540e\u904d\u5386\u76f4\u81f3\u627e\u5230\u76ee\u6807\u8282\u70b9\u3002\u4f8b\u5982\uff0c\u82e5\u8981\u8bbf\u95ee\u94fe\u8868\u7d22\u5f15\u4e3a index\uff08\u5373\u7b2c index + 1 \u4e2a\uff09\u7684\u8282\u70b9\uff0c\u5219\u9700\u8981\u5411\u540e\u904d\u5386 index \u8f6e\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\nfor (int i = 0; i < index; i++) {\nif (head == null)\nreturn null;\nhead = head.next;\n}\nreturn head;\n}\n
linked_list.cpp
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\nfor (int i = 0; i < index; i++) {\nif (head == nullptr)\nreturn nullptr;\nhead = head->next;\n}\nreturn head;\n}\n
linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n\"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\nfor _ in range(index):\nif not head:\nreturn None\nhead = head.next\nreturn head\n
linked_list.go
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\nfor i := 0; i < index; i++ {\nif head == nil {\nreturn nil\n}\nhead = head.Next\n}\nreturn head\n}\n
linked_list.js
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\nfor (let i = 0; i < index; i++) {\nif (!head) {\nreturn null;\n}\nhead = head.next;\n}\nreturn 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 {\nfor (let i = 0; i < index; i++) {\nif (!head) {\nreturn null;\n}\nhead = head.next;\n}\nreturn head;\n}\n
linked_list.c
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\nwhile (head && head->next && index) {\nhead = head->next;\nindex--;\n}\nreturn 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{\nfor (int i = 0; i < index; i++)\n{\nif (head == null)\nreturn null;\nhead = head.next;\n}\nreturn 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? {\nvar head: ListNode? = head\nfor _ in 0 ..< index {\nif head == nil {\nreturn nil\n}\nhead = head?.next\n}\nreturn head\n}\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) {\nvar head = node;\nvar i: i32 = 0;\nwhile (i < index) : (i += 1) {\nhead = head.?.next;\nif (head == null) return null;\n}\nreturn head;\n}\n

\u94fe\u8868\u7684\u5185\u5b58\u5360\u7528\u8f83\u5927\u3002\u94fe\u8868\u4ee5\u8282\u70b9\u4e3a\u5355\u4f4d\uff0c\u6bcf\u4e2a\u8282\u70b9\u9664\u4e86\u4fdd\u5b58\u503c\u4e4b\u5916\uff0c\u8fd8\u9700\u989d\u5916\u4fdd\u5b58\u6307\u9488\uff08\u5f15\u7528\uff09\u3002\u8fd9\u610f\u5473\u7740\u5728\u76f8\u540c\u6570\u636e\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u94fe\u8868\u6bd4\u6570\u7ec4\u9700\u8981\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002

"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3. \u00a0 \u94fe\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u904d\u5386\u94fe\u8868\u67e5\u627e\u3002\u904d\u5386\u94fe\u8868\uff0c\u67e5\u627e\u94fe\u8868\u5185\u503c\u4e3a target \u7684\u8282\u70b9\uff0c\u8f93\u51fa\u8282\u70b9\u5728\u94fe\u8868\u4e2d\u7684\u7d22\u5f15\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\nint index = 0;\nwhile (head != null) {\nif (head.val == target)\nreturn index;\nhead = head.next;\nindex++;\n}\nreturn -1;\n}\n
linked_list.cpp
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\nint index = 0;\nwhile (head != nullptr) {\nif (head->val == target)\nreturn index;\nhead = head->next;\nindex++;\n}\nreturn -1;\n}\n
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\"\"\"\nindex = 0\nwhile head:\nif head.val == target:\nreturn index\nhead = head.next\nindex += 1\nreturn -1\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 {\nindex := 0\nfor head != nil {\nif head.Val == target {\nreturn index\n}\nhead = head.Next\nindex++\n}\nreturn -1\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\nlet index = 0;\nwhile (head !== null) {\nif (head.val === target) {\nreturn index;\n}\nhead = head.next;\nindex += 1;\n}\nreturn -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 {\nlet index = 0;\nwhile (head !== null) {\nif (head.val === target) {\nreturn index;\n}\nhead = head.next;\nindex += 1;\n}\nreturn -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) {\nint index = 0;\nwhile (head) {\nif (head->val == target)\nreturn index;\nhead = head->next;\nindex++;\n}\nreturn -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{\nint index = 0;\nwhile (head != null)\n{\nif (head.val == target)\nreturn index;\nhead = head.next;\nindex++;\n}\nreturn -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 {\nvar head: ListNode? = head\nvar index = 0\nwhile head != nil {\nif head?.val == target {\nreturn index\n}\nhead = head?.next\nindex += 1\n}\nreturn -1\n}\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 {\nvar head = node;\nvar index: i32 = 0;\nwhile (head != null) {\nif (head.?.val == target) return index;\nhead = head.?.next;\nindex += 1;\n}\nreturn -1;\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4. \u00a0 \u5e38\u89c1\u94fe\u8868\u7c7b\u578b","text":"

\u5355\u5411\u94fe\u8868\u3002\u5373\u4e0a\u8ff0\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\u6307\u9488\uff08\u5f15\u7528\uff09\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\u6210\u4e3a\u5c3e\u8282\u70b9\uff0c\u5c3e\u8282\u70b9\u6307\u5411 \\(\\text{null}\\) \u3002

\u73af\u5f62\u94fe\u8868\u3002\u5982\u679c\u6211\u4eec\u4ee4\u5355\u5411\u94fe\u8868\u7684\u5c3e\u8282\u70b9\u6307\u5411\u5934\u8282\u70b9\uff08\u5373\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\u3002\u4e0e\u5355\u5411\u94fe\u8868\u76f8\u6bd4\uff0c\u53cc\u5411\u94fe\u8868\u8bb0\u5f55\u4e86\u4e24\u4e2a\u65b9\u5411\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\u3002\u53cc\u5411\u94fe\u8868\u7684\u8282\u70b9\u5b9a\u4e49\u540c\u65f6\u5305\u542b\u6307\u5411\u540e\u7ee7\u8282\u70b9\uff08\u4e0b\u4e00\u8282\u70b9\uff09\u548c\u524d\u9a71\u8282\u70b9\uff08\u4e0a\u4e00\u8282\u70b9\uff09\u7684\u6307\u9488\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nint val;        // \u8282\u70b9\u503c\nListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;         // \u8282\u70b9\u503c\nListNode *next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode *prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
class ListNode:\n\"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                   # \u8282\u70b9\u503c\nself.next: Optional[ListNode] = None  # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nself.prev: Optional[ListNode] = None  # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype DoublyListNode struct {\nVal  int             // \u8282\u70b9\u503c\nNext *DoublyListNode // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nPrev *DoublyListNode // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\nreturn &DoublyListNode{\nVal:  val,\nNext: nil,\nPrev: nil,\n}\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval;\nnext;\nprev;\nconstructor(val, next) {\nthis.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\nthis.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nthis.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval: number;\nnext: ListNode | null;\nprev: ListNode | null;\nconstructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\nthis.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\nthis.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nthis.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;               // \u8282\u70b9\u503c\nstruct ListNode *next; // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nstruct ListNode *prev; // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n};\ntypedef struct ListNode ListNode;\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\nListNode *node, *next;\nnode = (ListNode *) malloc(sizeof(ListNode));\nnode->val = val;\nnode->next = NULL;\nnode->prev = NULL;\nreturn node;\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nint val;        // \u8282\u70b9\u503c\nListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) => val = x;  // \u6784\u9020\u51fd\u6570\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nvar val: Int // \u8282\u70b9\u503c\nvar next: ListNode? // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nvar prev: ListNode? // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\ninit(x: Int) { // \u6784\u9020\u51fd\u6570\nval = x\n}\n}\n
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nval: T = 0, // \u8282\u70b9\u503c\nnext: ?*Self = null, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nprev: ?*Self = null, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n// \u6784\u9020\u51fd\u6570\npub fn init(self: *Self, x: i32) void {\nself.val = x;\nself.next = null;\nself.prev = null;\n}\n};\n}\n

Fig. \u5e38\u89c1\u94fe\u8868\u79cd\u7c7b

"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3. \u00a0 \u5217\u8868","text":"

\u6570\u7ec4\u957f\u5ea6\u4e0d\u53ef\u53d8\u5bfc\u81f4\u5b9e\u7528\u6027\u964d\u4f4e\u3002\u5728\u8bb8\u591a\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u4e8b\u5148\u65e0\u6cd5\u786e\u5b9a\u9700\u8981\u5b58\u50a8\u591a\u5c11\u6570\u636e\uff0c\u8fd9\u4f7f\u6570\u7ec4\u957f\u5ea6\u7684\u9009\u62e9\u53d8\u5f97\u56f0\u96be\u3002\u82e5\u957f\u5ea6\u8fc7\u5c0f\uff0c\u9700\u8981\u5728\u6301\u7eed\u6dfb\u52a0\u6570\u636e\u65f6\u9891\u7e41\u6269\u5bb9\u6570\u7ec4\uff1b\u82e5\u957f\u5ea6\u8fc7\u5927\uff0c\u5219\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u7684\u6d6a\u8d39\u3002

\u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u51fa\u73b0\u4e86\u4e00\u79cd\u88ab\u79f0\u4e3a\u300c\u52a8\u6001\u6570\u7ec4 Dynamic Array\u300d\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5373\u957f\u5ea6\u53ef\u53d8\u7684\u6570\u7ec4\uff0c\u4e5f\u5e38\u88ab\u79f0\u4e3a\u300c\u5217\u8868 List\u300d\u3002\u5217\u8868\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\uff0c\u7ee7\u627f\u4e86\u6570\u7ec4\u7684\u4f18\u70b9\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u52a8\u6001\u6269\u5bb9\u3002\u5728\u5217\u8868\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u7531\u6dfb\u52a0\u5143\u7d20\uff0c\u800c\u65e0\u9700\u62c5\u5fc3\u8d85\u8fc7\u5bb9\u91cf\u9650\u5236\u3002

"},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1. \u00a0 \u5217\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u521d\u59cb\u5316\u5217\u8868\u3002\u901a\u5e38\u6211\u4eec\u4f1a\u4f7f\u7528\u201c\u65e0\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u7684\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<Integer> list1 = 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> list = new ArrayList<>(Arrays.asList(numbers));\n
list.cpp
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 list\n// \u65e0\u521d\u59cb\u503c\nvector<int> list1;\n// \u6709\u521d\u59cb\u503c\nvector<int> list = { 1, 3, 2, 5, 4 };\n
list.py
# \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nlist1: List[int] = []\n# \u6709\u521d\u59cb\u503c\nlist: List[int] = [1, 3, 2, 5, 4]\n
list_test.go
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlist1 := []int\n// \u6709\u521d\u59cb\u503c\nlist := []int{1, 3, 2, 5, 4}\n
list.js
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst list1 = [];\n// \u6709\u521d\u59cb\u503c\nconst list = [1, 3, 2, 5, 4];\n
list.ts
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst list1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst list: number[] = [1, 3, 2, 5, 4];\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> list1 = new ();\n// \u6709\u521d\u59cb\u503c\nint[] numbers = new int[] { 1, 3, 2, 5, 4 };\nList<int> list = numbers.ToList();\n
list.swift
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet list1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar list = [1, 3, 2, 5, 4]\n
list.zig
// \u521d\u59cb\u5316\u5217\u8868\nvar list = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer list.deinit();\ntry list.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n

\u8bbf\u95ee\u4e0e\u66f4\u65b0\u5143\u7d20\u3002\u7531\u4e8e\u5217\u8868\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = list.get(1);  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist.set(1, 0);  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.cpp
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.py
# \u8bbf\u95ee\u5143\u7d20\nnum: int = list[1]  # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nlist[1] = 0    # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list_test.go
/* \u8bbf\u95ee\u5143\u7d20 */\nnum := list[1]  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0     // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.js
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.ts
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num: number = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[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.cs
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.swift
/* \u8bbf\u95ee\u5143\u7d20 */\nlet num = list[1] // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0 // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.zig
// \u8bbf\u95ee\u5143\u7d20\nvar num = list.items[1]; // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n// \u66f4\u65b0\u5143\u7d20\nlist.items[1] = 0; // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0  \n

\u5728\u5217\u8868\u4e2d\u6dfb\u52a0\u3001\u63d2\u5165\u3001\u5220\u9664\u5143\u7d20\u3002\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u6e05\u7a7a\u5217\u8868 */\nlist.clear();\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.add(1);\nlist.add(3);\nlist.add(2);\nlist.add(5);\nlist.add(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.cpp
/* \u6e05\u7a7a\u5217\u8868 */\nlist.clear();\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.push_back(1);\nlist.push_back(3);\nlist.push_back(2);\nlist.push_back(5);\nlist.push_back(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.insert(list.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist.erase(list.begin() + 3);      // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.py
# \u6e05\u7a7a\u5217\u8868\nlist.clear()\n# \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nlist.append(1)\nlist.append(3)\nlist.append(2)\nlist.append(5)\nlist.append(4)\n# \u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nlist.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n# \u5220\u9664\u5143\u7d20\nlist.pop(3)        # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list_test.go
/* \u6e05\u7a7a\u5217\u8868 */\nlist = nil\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist = append(list, 1)\nlist = append(list, 3)\nlist = append(list, 2)\nlist = append(list, 5)\nlist = append(list, 4)\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist = append(list[:3], append([]int{6}, list[3:]...)...) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist = append(list[:3], list[4:]...) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.js
/* \u6e05\u7a7a\u5217\u8868 */\nlist.length = 0;\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.push(1);\nlist.push(3);\nlist.push(2);\nlist.push(5);\nlist.push(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.splice(3, 0, 6);\n/* \u5220\u9664\u5143\u7d20 */\nlist.splice(3, 1);\n
list.ts
/* \u6e05\u7a7a\u5217\u8868 */\nlist.length = 0;\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.push(1);\nlist.push(3);\nlist.push(2);\nlist.push(5);\nlist.push(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.splice(3, 0, 6);\n/* \u5220\u9664\u5143\u7d20 */\nlist.splice(3, 1);\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u6e05\u7a7a\u5217\u8868 */\nlist.Clear();\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.Add(1);\nlist.Add(3);\nlist.Add(2);\nlist.Add(5);\nlist.Add(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.Insert(3, 6);\n/* \u5220\u9664\u5143\u7d20 */\nlist.RemoveAt(3);\n
list.swift
/* \u6e05\u7a7a\u5217\u8868 */\nlist.removeAll()\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.append(1)\nlist.append(3)\nlist.append(2)\nlist.append(5)\nlist.append(4)\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist.remove(at: 3) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.zig
// \u6e05\u7a7a\u5217\u8868\nlist.clearRetainingCapacity();\n// \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\ntry list.append(1);\ntry list.append(3);\ntry list.append(2);\ntry list.append(5);\ntry list.append(4);\n// \u4e2d\u95f4\u63d2\u5165\u5143\u7d20\ntry list.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n// \u5220\u9664\u5143\u7d20\n_ = list.orderedRemove(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n

\u904d\u5386\u5217\u8868\u3002\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < list.size(); i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int n : list) {\ncount++;\n}\n
list.cpp
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < list.size(); i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int n : list) {\ncount++;\n}\n
list.py
# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount: int = 0\nfor i in range(len(list)):\ncount += 1\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount: int = 0\nfor n in list:\ncount += 1\n
list_test.go
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\ncount := 0\nfor i := 0; i < len(list); i++ {\ncount++\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor range list {\ncount++\n}\n
list.js
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < list.length; i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const n of list) {\ncount++;\n}\n
list.ts
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < list.length; i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const n of list) {\ncount++;\n}\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < list.Count(); i++)\n{\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nforeach (int n in list)\n{\ncount++;\n}\n
list.swift
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor _ in list.indices {\ncount += 1\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor _ in list {\ncount += 1\n}\n
list.zig
// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < list.items.len) : (i += 1) {\ncount += 1;\n}\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0;\nfor (list.items) |_| {\ncount += 1;\n}\n

\u62fc\u63a5\u4e24\u4e2a\u5217\u8868\u3002\u7ed9\u5b9a\u4e00\u4e2a\u65b0\u5217\u8868 list1 \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8be5\u5217\u8868\u62fc\u63a5\u5230\u539f\u5217\u8868\u7684\u5c3e\u90e8\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<Integer> list1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nlist.addAll(list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.cpp
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nvector<int> list1 = { 6, 8, 7, 10, 9 };\n// \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\nlist.insert(list.end(), list1.begin(), list1.end());\n
list.py
# \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nlist1: List[int] = [6, 8, 7, 10, 9]\nlist += list1  # \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list_test.go
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlist1 := []int{6, 8, 7, 10, 9}\nlist = append(list, list1...)  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.js
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst list1 = [6, 8, 7, 10, 9];\nlist.push(...list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.ts
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst list1: number[] = [6, 8, 7, 10, 9];\nlist.push(...list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> list1 = new() { 6, 8, 7, 10, 9 };\nlist.AddRange(list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.swift
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet list1 = [6, 8, 7, 10, 9]\nlist.append(contentsOf: list1) // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.zig
// \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nvar list1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer list1.deinit();\ntry list1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry list.insertSlice(list.items.len, list1.items); // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n

\u6392\u5e8f\u5217\u8868\u3002\u6392\u5e8f\u4e5f\u662f\u5e38\u7528\u7684\u65b9\u6cd5\u4e4b\u4e00\u3002\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\u5bdf\u7684\u300c\u4e8c\u5206\u67e5\u627e\u300d\u548c\u300c\u53cc\u6307\u9488\u300d\u7b97\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u6392\u5e8f\u5217\u8868 */\nCollections.sort(list);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.cpp
/* \u6392\u5e8f\u5217\u8868 */\nsort(list.begin(), list.end());  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.py
# \u6392\u5e8f\u5217\u8868\nlist.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(list)  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.js
/* \u6392\u5e8f\u5217\u8868 */  list.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 */\nlist.sort((a, b) => a - b);  // \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.cs
/* \u6392\u5e8f\u5217\u8868 */\nlist.Sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.swift
/* \u6392\u5e8f\u5217\u8868 */\nlist.sort() // \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, list.items, {}, comptime std.sort.asc(i32));\n
"},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2. \u00a0 \u5217\u8868\u5b9e\u73b0 *","text":"

\u4e3a\u4e86\u5e2e\u52a9\u52a0\u6df1\u5bf9\u5217\u8868\u7684\u7406\u89e3\uff0c\u6211\u4eec\u5728\u6b64\u63d0\u4f9b\u4e00\u4e2a\u7b80\u6613\u7248\u5217\u8868\u5b9e\u73b0\u3002\u9700\u8981\u5173\u6ce8\u4e09\u4e2a\u6838\u5fc3\u70b9\uff1a

  • \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\u63d2\u5165\u5143\u7d20\u65f6\u53ef\u80fd\u8d85\u51fa\u5217\u8868\u5bb9\u91cf\uff0c\u6b64\u65f6\u9700\u8981\u6269\u5bb9\u5217\u8868\u3002\u6269\u5bb9\u65b9\u6cd5\u662f\u6839\u636e\u6269\u5bb9\u500d\u6570\u521b\u5efa\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u5e76\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

\u672c\u793a\u4f8b\u65e8\u5728\u5e2e\u52a9\u8bfb\u8005\u76f4\u89c2\u7406\u89e3\u5217\u8868\u7684\u5de5\u4f5c\u673a\u5236\u3002\u5b9e\u9645\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u5217\u8868\u5b9e\u73b0\u66f4\u52a0\u6807\u51c6\u548c\u590d\u6742\uff0c\u5404\u4e2a\u53c2\u6570\u7684\u8bbe\u5b9a\u4e5f\u975e\u5e38\u6709\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_list.java
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate int[] nums; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate int capacity = 10; // \u5217\u8868\u5bb9\u91cf\nprivate int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\npublic MyList() {\nnums = new int[capacity];\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\npublic int size() {\nreturn size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic int capacity() {\nreturn capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\npublic int get(int index) {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic void set(int index, int num) {\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\nnums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\npublic void add(int num) {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size == capacity())\nextendCapacity();\nnums[size] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nsize++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\npublic void insert(int index, int num) {\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size == capacity())\nextendCapacity();\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int j = size - 1; j >= index; j--) {\nnums[j + 1] = nums[j];\n}\nnums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nsize++;\n}\n/* \u5220\u9664\u5143\u7d20 */\npublic int remove(int index) {\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\nint num = nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int j = index; j < size - 1; j++) {\nnums[j] = nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nsize--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\npublic void extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nnums = Arrays.copyOf(nums, capacity() * extendRatio);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\ncapacity = nums.length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\npublic int[] toArray() {\nint size = size();\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] nums = new int[size];\nfor (int i = 0; i < size; i++) {\nnums[i] = get(i);\n}\nreturn nums;\n}\n}\n
my_list.cpp
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate:\nint *nums;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nint numsCapacity = 10; // \u5217\u8868\u5bb9\u91cf\nint numsSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nint extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nMyList() {\nnums = new int[numsCapacity];\n}\n/* \u6790\u6784\u65b9\u6cd5 */\n~MyList() {\ndelete[] nums;\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\nint size() {\nreturn numsSize;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity() {\nreturn numsCapacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(int index) {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(int index, int num) {\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\nnums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(int num) {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size() == capacity())\nextendCapacity();\nnums[size()] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(int index, int num) {\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size() == capacity())\nextendCapacity();\n// \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int j = size() - 1; j >= index; j--) {\nnums[j + 1] = nums[j];\n}\nnums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u5220\u9664\u5143\u7d20 */\nint remove(int index) {\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\nint num = nums[index];\n// \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int j = index; j < size() - 1; j++) {\nnums[j] = nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nint newCapacity = capacity() * extendRatio;\nint *tmp = nums;\nnums = new int[newCapacity];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < size(); i++) {\nnums[i] = tmp[i];\n}\n// \u91ca\u653e\u5185\u5b58\ndelete[] tmp;\nnumsCapacity = newCapacity;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\nvector<int> toVector() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvector<int> vec(size());\nfor (int i = 0; i < size(); i++) {\nvec[i] = nums[i];\n}\nreturn vec;\n}\n};\n
my_list.py
class MyList:\n\"\"\"\u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\nself.__nums: my_list[int] = [0] * self.__capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nself.__size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nself.__extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\nreturn self.__size\ndef capacity(self) -> int:\n\"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\nreturn self.__capacity\ndef get(self, index: int) -> int:\n\"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n# \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\nreturn self.__nums[index]\ndef set(self, num: int, index: int) -> None:\n\"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\nself.__nums[index] = num\ndef add(self, num: int) -> None:\n\"\"\"\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n# \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif self.size() == self.capacity():\nself.extend_capacity()\nself.__nums[self.__size] = num\nself.__size += 1\ndef insert(self, num: int, index: int) -> None:\n\"\"\"\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\n# \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif self.__size == self.capacity():\nself.extend_capacity()\n# \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor j in range(self.__size - 1, index - 1, -1):\nself.__nums[j + 1] = self.__nums[j]\nself.__nums[index] = num\n# \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.__size += 1\ndef remove(self, index: int) -> int:\n\"\"\"\u5220\u9664\u5143\u7d20\"\"\"\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\nnum = self.__nums[index]\n# \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor j in range(index, self.__size - 1):\nself.__nums[j] = self.__nums[j + 1]\n# \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.__size -= 1\n# \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num\ndef extend_capacity(self) -> None:\n\"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n# \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a self.__size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nself.__nums = self.__nums + [0] * self.capacity() * (self.__extend_ratio - 1)\n# \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nself.__capacity = len(self.__nums)\ndef to_array(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\nreturn self.__nums[: self.__size]\n
my_list.go
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\ntype myList struct {\nnumsCapacity int\nnums         []int\nnumsSize     int\nextendRatio  int\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newMyList() *myList {\nreturn &myList{\nnumsCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\nnums:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nnumsSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nextendRatio:  2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\nreturn l.numsSize\n}\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\nreturn l.numsCapacity\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nreturn l.nums[index]\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nl.nums[index] = num\n}\n/* \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\nif l.numsSize == l.numsCapacity {\nl.extendCapacity()\n}\nl.nums[l.numsSize] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nl.numsSize++\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif l.numsSize == l.numsCapacity {\nl.extendCapacity()\n}\n// \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor j := l.numsSize - 1; j >= index; j-- {\nl.nums[j+1] = l.nums[j]\n}\nl.nums[index] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nl.numsSize++\n}\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nnum := l.nums[index]\n// \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor j := index; j < l.numsSize-1; j++ {\nl.nums[j] = l.nums[j+1]\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nl.numsSize--\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num\n}\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a self.__size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nl.nums = append(l.nums, make([]int, l.numsCapacity*(l.extendRatio-1))...)\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nl.numsCapacity = len(l.nums)\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\nreturn l.nums[:l.numsSize]\n}\n
my_list.js
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\n#nums = 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\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n#extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor() {\nthis.#nums = new Array(this.#capacity);\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\nsize() {\nreturn this.#size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\ncapacity() {\nreturn this.#capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nget(index) {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nreturn this.#nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nset(index, num) {\nif (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nthis.#nums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nadd(num) {\n// \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\nif (this.#size === this.#capacity) {\nthis.extendCapacity();\n}\n// \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\nthis.#nums[this.#size] = num;\nthis.#size++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\ninsert(index, num) {\nif (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\nif (this.#size === this.#capacity) {\nthis.extendCapacity();\n}\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (let j = this.#size - 1; j >= index; j--) {\nthis.#nums[j + 1] = this.#nums[j];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis.#nums[index] = num;\nthis.#size++;\n}\n/* \u5220\u9664\u5143\u7d20 */\nremove(index) {\nif (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nlet num = this.#nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (let j = index; j < this.#size - 1; j++) {\nthis.#nums[j] = this.#nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis.#size--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\nextendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nthis.#nums = this.#nums.concat(\nnew Array(this.capacity() * (this.#extendRatio - 1))\n);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nthis.#capacity = this.#nums.length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\ntoArray() {\nlet size = this.size();\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst nums = new Array(size);\nfor (let i = 0; i < size; i++) {\nnums[i] = this.get(i);\n}\nreturn nums;\n}\n}\n
my_list.ts
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate nums: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\nprivate _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor() {\nthis.nums = new Array(this._capacity);\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\npublic size(): number {\nreturn this._size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic capacity(): number {\nreturn this._capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\npublic get(index: number): number {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nreturn this.nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic set(index: number, num: number): void {\nif (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nthis.nums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\npublic add(num: number): void {\n// \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\nif (this._size === this._capacity) this.extendCapacity();\n// \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\nthis.nums[this._size] = num;\nthis._size++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\npublic insert(index: number, num: number): void {\nif (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\nif (this._size === this._capacity) {\nthis.extendCapacity();\n}\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (let j = this._size - 1; j >= index; j--) {\nthis.nums[j + 1] = this.nums[j];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis.nums[index] = num;\nthis._size++;\n}\n/* \u5220\u9664\u5143\u7d20 */\npublic remove(index: number): number {\nif (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nlet num = this.nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (let j = index; j < this._size - 1; j++) {\nthis.nums[j] = this.nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis._size--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\npublic extendCapacity(): void {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nthis.nums = this.nums.concat(\nnew Array(this.capacity() * (this.extendRatio - 1))\n);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nthis._capacity = this.nums.length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\npublic toArray(): number[] {\nlet size = this.size();\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst nums = new Array(size);\nfor (let i = 0; i < size; i++) {\nnums[i] = this.get(i);\n}\nreturn nums;\n}\n}\n
my_list.c
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nstruct myList {\nint *nums;       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nint capacity;    // \u5217\u8868\u5bb9\u91cf\nint size;        // \u5217\u8868\u5927\u5c0f\nint extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n};\n/* \u6784\u9020\u51fd\u6570 */\nmyList *newMyList() {\nmyList *list = malloc(sizeof(myList));\nlist->capacity = 10;\nlist->nums = malloc(sizeof(int) * list->capacity);\nlist->size = 0;\nlist->extendRatio = 2;\nreturn list;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(myList *list) {\nfree(list->nums);\nfree(list);\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(myList *list) {\nreturn list->size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(myList *list) {\nreturn list->capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(myList *list, int index) {\nassert(index >= 0 && index < list->size);\nreturn list->nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(myList *list, int index, int num) {\nassert(index >= 0 && index < list->size);\nlist->nums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(myList *list, int num) {\nif (size(list) == capacity(list)) {\nextendCapacity(list); // \u6269\u5bb9\n}\nlist->nums[size(list)] = num;\nlist->size++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(myList *list, int index, int num) {\nassert(index >= 0 && index < size(list));\nfor (int i = size(list); i > index; --i) {\nlist->nums[i] = list->nums[i - 1];\n}\nlist->nums[index] = num;\nlist->size++;\n}\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeNum(myList *list, int index) {\nassert(index >= 0 && index < size(list));\nint num = list->nums[index];\nfor (int i = index; i < size(list) - 1; i++) {\nlist->nums[i] = list->nums[i + 1];\n}\nlist->size--;\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(myList *list) {\n// \u5148\u5206\u914d\u7a7a\u95f4\nint newCapacity = capacity(list) * list->extendRatio;\nint *extend = (int *)malloc(sizeof(int) * newCapacity);\nint *temp = list->nums;\n// \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\nfor (int i = 0; i < size(list); i++)\nextend[i] = list->nums[i];\n// \u91ca\u653e\u65e7\u6570\u636e\nfree(temp);\n// \u66f4\u65b0\u65b0\u6570\u636e\nlist->nums = extend;\nlist->capacity = newCapacity;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(myList *list) {\nreturn list->nums;\n}\n
my_list.cs
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList\n{\nprivate int[] nums;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate int numsCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\nprivate int numsSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\npublic MyList()\n{\nnums = new int[numsCapacity];\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\npublic int size()\n{\nreturn numsSize;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic int capacity()\n{\nreturn numsCapacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\npublic int get(int index)\n{\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic void set(int index, int num)\n{\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nnums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\npublic void add(int num)\n{\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (numsSize == numsCapacity)\nextendCapacity();\nnums[numsSize] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\npublic void insert(int index, int num)\n{\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (numsSize == numsCapacity)\nextendCapacity();\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int j = numsSize - 1; j >= index; j--)\n{\nnums[j + 1] = nums[j];\n}\nnums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u5220\u9664\u5143\u7d20 */\npublic int remove(int index)\n{\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nint num = nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int j = index; j < numsSize - 1; j++)\n{\nnums[j] = nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\npublic void extendCapacity()\n{\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a numsCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nSystem.Array.Resize(ref nums, numsCapacity * extendRatio);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nnumsCapacity = nums.Length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\npublic int[] toArray()\n{\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] nums = new int[numsSize];\nfor (int i = 0; i < numsSize; i++)\n{\nnums[i] = get(i);\n}\nreturn nums;\n}\n}\n
my_list.swift
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate var nums: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate var _capacity = 10 // \u5217\u8868\u5bb9\u91cf\nprivate var _size = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate let extendRatio = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\ninit() {\nnums = Array(repeating: 0, count: _capacity)\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\nfunc size() -> Int {\n_size\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc capacity() -> Int {\n_capacity\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc get(index: Int) -> Int {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nreturn nums[index]\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc set(index: Int, num: Int) {\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nnums[index] = num\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc add(num: Int) {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif _size == _capacity {\nextendCapacity()\n}\nnums[_size] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n_size += 1\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc insert(index: Int, num: Int) {\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif _size == _capacity {\nextendCapacity()\n}\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor j in sequence(first: _size - 1, next: { $0 >= index + 1 ? $0 - 1 : nil }) {\nnums[j + 1] = nums[j]\n}\nnums[index] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n_size += 1\n}\n/* \u5220\u9664\u5143\u7d20 */\n@discardableResult\nfunc remove(index: Int) -> Int {\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nlet num = nums[index]\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor j in index ..< (_size - 1) {\nnums[j] = nums[j + 1]\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n_size -= 1\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num\n}\n/* \u5217\u8868\u6269\u5bb9 */\nfunc extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nnums = nums + Array(repeating: 0, count: _capacity * (extendRatio - 1))\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n_capacity = nums.count\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\nfunc toArray() -> [Int] {\nvar nums = Array(repeating: 0, count: _size)\nfor i in 0 ..< _size {\nnums[i] = get(index: i)\n}\nreturn nums\n}\n}\n
my_list.zig
// \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0\nfn MyList(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nnums: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nnums_capacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\nnum_size: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nextend_ratio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.nums = try self.mem_allocator.alloc(T, self.nums_capacity);\nstd.mem.set(T, self.nums, @as(T, 0));\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\npub fn size(self: *Self) usize {\nreturn self.num_size;\n}\n// \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\npub fn capacity(self: *Self) usize {\nreturn self.nums_capacity;\n}\n// \u8bbf\u95ee\u5143\u7d20\npub fn get(self: *Self, index: usize) T {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn self.nums[index];\n}  // \u66f4\u65b0\u5143\u7d20\npub fn set(self: *Self, index: usize, num: T) void {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\nself.nums[index] = num;\n}  // \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\npub fn add(self: *Self, num: T) !void {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (self.size() == self.capacity()) try self.extendCapacity();\nself.nums[self.size()] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.num_size += 1;\n}  // \u4e2d\u95f4\u63d2\u5165\u5143\u7d20\npub fn insert(self: *Self, index: usize, num: T) !void {\nif (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\nif (self.size() == self.capacity()) try self.extendCapacity();\n// \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nvar j = self.size() - 1;\nwhile (j >= index) : (j -= 1) {\nself.nums[j + 1] = self.nums[j];\n}\nself.nums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.num_size += 1;\n}\n// \u5220\u9664\u5143\u7d20\npub fn remove(self: *Self, index: usize) T {\nif (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\nvar num = self.nums[index];\n// \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nvar j = index;\nwhile (j < self.size() - 1) : (j += 1) {\nself.nums[j] = self.nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.num_size -= 1;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n// \u5217\u8868\u6269\u5bb9\npub fn extendCapacity(self: *Self) !void {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extend_ratio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nvar newCapacity = self.capacity() * self.extend_ratio;\nvar extend = try self.mem_allocator.alloc(T, newCapacity);\nstd.mem.set(T, extend, @as(T, 0));\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nstd.mem.copy(T, extend, self.nums);\nself.nums = extend;\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nself.nums_capacity = newCapacity;\n}\n// \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar nums = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, nums, @as(T, 0));\nfor (nums) |*num, i| {\nnum.* = self.get(i);\n}\nreturn nums;\n}\n};\n}\n
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.4. \u00a0 \u5c0f\u7ed3","text":"
  • \u6570\u7ec4\u548c\u94fe\u8868\u662f\u4e24\u79cd\u57fa\u672c\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u4ee3\u8868\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u79bb\u6563\u7a7a\u95f4\u5b58\u50a8\u65b9\u5f0f\u3002\u4e24\u8005\u7684\u4f18\u7f3a\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\u6307\u9488\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\u5faa\u73af\u94fe\u8868\u3001\u53cc\u5411\u94fe\u8868\u3002
  • \u52a8\u6001\u6570\u7ec4\uff0c\u53c8\u79f0\u5217\u8868\uff0c\u662f\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u4e00\u79cd\u6570\u636e\u7ed3\u6784\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\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u6613\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
  • \u4e0b\u8868\u603b\u7ed3\u5e76\u5bf9\u6bd4\u4e86\u6570\u7ec4\u4e0e\u94fe\u8868\u7684\u5404\u9879\u7279\u6027\u3002
\u6570\u7ec4 \u94fe\u8868 \u5b58\u50a8\u65b9\u5f0f \u8fde\u7eed\u5185\u5b58\u7a7a\u95f4 \u79bb\u6563\u5185\u5b58\u7a7a\u95f4 \u6570\u636e\u7ed3\u6784\u957f\u5ea6 \u957f\u5ea6\u4e0d\u53ef\u53d8 \u957f\u5ea6\u53ef\u53d8 \u5185\u5b58\u4f7f\u7528\u7387 \u5360\u7528\u5185\u5b58\u5c11\u3001\u7f13\u5b58\u5c40\u90e8\u6027\u597d \u5360\u7528\u5185\u5b58\u591a \u4f18\u52bf\u64cd\u4f5c \u968f\u673a\u8bbf\u95ee \u63d2\u5165\u3001\u5220\u9664

\u7f13\u5b58\u5c40\u90e8\u6027

\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6570\u636e\u8bfb\u5199\u901f\u5ea6\u6392\u5e8f\u662f\u201c\u786c\u76d8 < \u5185\u5b58 < CPU \u7f13\u5b58\u201d\u3002\u5f53\u6211\u4eec\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\u94fe\u8868\u5219\u4e0d\u7136\uff0c\u8ba1\u7b97\u673a\u53ea\u80fd\u6328\u4e2a\u5730\u7f13\u5b58\u5404\u4e2a\u8282\u70b9\uff0c\u8fd9\u6837\u7684\u591a\u6b21\u201c\u642c\u8fd0\u201d\u964d\u4f4e\u4e86\u6574\u4f53\u6548\u7387\u3002

  • \u4e0b\u8868\u5bf9\u6bd4\u4e86\u6570\u7ec4\u4e0e\u94fe\u8868\u5728\u5404\u79cd\u64cd\u4f5c\u4e0a\u7684\u6548\u7387\u3002
\u64cd\u4f5c \u6570\u7ec4 \u94fe\u8868 \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_backtracking/backtracking_algorithm/","title":"13.1. \u00a0 \u56de\u6eaf\u7b97\u6cd5","text":"

\u300c\u56de\u6eaf\u7b97\u6cd5 Backtracking Algorithm\u300d\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\u300c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u300d\u6765\u904d\u5386\u89e3\u7a7a\u95f4\u3002\u5728\u4e8c\u53c9\u6811\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\u4e0b\u9762\uff0c\u6211\u4eec\u4ece\u4e8c\u53c9\u6811\u7684\u524d\u5e8f\u904d\u5386\u5165\u624b\uff0c\u9010\u6b65\u4e86\u89e3\u56de\u6eaf\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u4f8b\u9898\u4e00\uff1a\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u5e76\u8fd4\u56de\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9

\u89e3\u9898\u601d\u8def\uff1a\u524d\u5e8f\u904d\u5386\u8fd9\u9897\u6811\uff0c\u5e76\u5224\u65ad\u5f53\u524d\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \uff0c\u82e5\u662f\u5219\u5c06\u8be5\u8282\u70b9\u7684\u503c\u52a0\u5165\u5230\u7ed3\u679c\u5217\u8868 res \u4e4b\u4e2d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig preorder_find_nodes.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\nif (root == null) {\nreturn;\n}\nif (root.val == 7) {\n// \u8bb0\u5f55\u89e3\nres.add(root);\n}\npreOrder(root.left);\npreOrder(root.right);\n}\n
preorder_find_nodes.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\nif (root == nullptr) {\nreturn;\n}\nif (root->val == 7) {\n// \u8bb0\u5f55\u89e3\nres.push_back(root);\n}\npreOrder(root->left);\npreOrder(root->right);\n}\n
preorder_find_nodes.py
def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\nif root.val == 7:\n# \u8bb0\u5f55\u89e3\nres.append(root)\npre_order(root.left)\npre_order(root.right)\n
preorder_find_nodes.go
[class]{}-[func]{preOrder}\n
preorder_find_nodes.js
[class]{}-[func]{preOrder}\n
preorder_find_nodes.ts
[class]{}-[func]{preOrder}\n
preorder_find_nodes.c
[class]{}-[func]{preOrder}\n
preorder_find_nodes.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root)\n{\nif (root == null)\n{\nreturn;\n}\nif (root.val == 7)\n{\n// \u8bb0\u5f55\u89e3\nres.Add(root);\n}\npreOrder(root.left);\npreOrder(root.right);\n}\n
preorder_find_nodes.swift
[class]{}-[func]{preOrder}\n
preorder_find_nodes.zig
[class]{}-[func]{preOrder}\n

Fig. \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\u7ed3\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\u7b49\u4ef7\u4e8e\u51fd\u6570\u8fd4\u56de\u3002\u4e3a\u89e3\u91ca\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u5bf9\u4f8b\u9898\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84

\u89e3\u9898\u601d\u8def\uff1a\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig preorder_find_paths.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\nif (root == null) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.add(root);\nif (root.val == 7) {\n// \u8bb0\u5f55\u89e3\nres.add(new ArrayList<>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.remove(path.size() - 1);\n}\n
preorder_find_paths.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\nif (root == nullptr) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push_back(root);\nif (root->val == 7) {\n// \u8bb0\u5f55\u89e3\nres.push_back(path);\n}\npreOrder(root->left);\npreOrder(root->right);\n// \u56de\u9000\npath.pop_back();\n}\n
preorder_find_paths.py
def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u5c1d\u8bd5\npath.append(root)\nif root.val == 7:\n# \u8bb0\u5f55\u89e3\nres.append(list(path))\npre_order(root.left)\npre_order(root.right)\n# \u56de\u9000\npath.pop()\n
preorder_find_paths.go
[class]{}-[func]{preOrder}\n
preorder_find_paths.js
[class]{}-[func]{preOrder}\n
preorder_find_paths.ts
[class]{}-[func]{preOrder}\n
preorder_find_paths.c
[class]{}-[func]{preOrder}\n
preorder_find_paths.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root)\n{\nif (root == null)\n{\nreturn;\n}\n// \u5c1d\u8bd5\npath.Add(root);\nif (root.val == 7)\n{\n// \u8bb0\u5f55\u89e3\nres.Add(new List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
preorder_find_paths.swift
[class]{}-[func]{preOrder}\n
preorder_find_paths.zig
[class]{}-[func]{preOrder}\n

\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\u6362\u53e5\u8bdd\u8bf4\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\u662f\u4e92\u4e3a\u76f8\u53cd\u7684\u3002

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

"},{"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\uff1a\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\uff0c\u8def\u5f84\u4e2d\u4e0d\u80fd\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9

\u89e3\u9898\u601d\u8def\uff1a\u5728\u4f8b\u9898\u4e8c\u7684\u57fa\u7840\u4e0a\u6dfb\u52a0\u526a\u679d\u64cd\u4f5c\uff0c\u5f53\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u7ec8\u6b62\u7ee7\u7eed\u641c\u7d22\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig preorder_find_constrained_paths.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n// \u526a\u679d\nif (root == null || root.val == 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.add(root);\nif (root.val == 7) {\n// \u8bb0\u5f55\u89e3\nres.add(new ArrayList<>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.remove(path.size() - 1);\n}\n
preorder_find_constrained_paths.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n// \u526a\u679d\nif (root == nullptr || root->val == 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push_back(root);\nif (root->val == 7) {\n// \u8bb0\u5f55\u89e3\nres.push_back(path);\n}\npreOrder(root->left);\npreOrder(root->right);\n// \u56de\u9000\npath.pop_back();\n}\n
preorder_find_constrained_paths.py
def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n# \u526a\u679d\nif root is None or root.val == 3:\nreturn\n# \u5c1d\u8bd5\npath.append(root)\nif root.val == 7:\n# \u8bb0\u5f55\u89e3\nres.append(list(path))\npre_order(root.left)\npre_order(root.right)\n# \u56de\u9000\npath.pop()\n
preorder_find_constrained_paths.go
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.js
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.ts
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.c
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root)\n{\n// \u526a\u679d\nif (root == null || root.val == 3)\n{\nreturn;\n}\n// \u5c1d\u8bd5\npath.Add(root);\nif (root.val == 7)\n{\n// \u8bb0\u5f55\u89e3\nres.Add(new List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
preorder_find_constrained_paths.swift
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.zig
[class]{}-[func]{preOrder}\n

\u526a\u679d\u662f\u4e00\u4e2a\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8bcd\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u5229\u7528\u7ea6\u675f\u6761\u4ef6\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\u5347\u641c\u7d22\u6548\u7387\u3002

Fig. \u6839\u636e\u7ea6\u675f\u6761\u4ef6\u526a\u679d

"},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3. \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\u3002

\u540d\u8bcd \u5b9a\u4e49 \u4f8b\u9898\u4e09 \u89e3 Solution \u89e3\u662f\u6ee1\u8db3\u95ee\u9898\u7279\u5b9a\u6761\u4ef6\u7684\u7b54\u6848\u3002\u56de\u6eaf\u7b97\u6cd5\u7684\u76ee\u6807\u662f\u627e\u5230\u4e00\u4e2a\u6216\u591a\u4e2a\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3 \u6839\u8282\u70b9\u5230\u8282\u70b9 \\(7\\) \u7684\u6240\u6709\u8def\u5f84\uff0c\u4e14\u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9 \u72b6\u6001 State \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 \u7ea6\u675f\u6761\u4ef6 Constraint \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 \u8981\u6c42\u8def\u5f84\u4e2d\u4e0d\u80fd\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9 \u5c1d\u8bd5 Attempt \u5c1d\u8bd5\u662f\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6839\u636e\u5f53\u524d\u72b6\u6001\u548c\u53ef\u7528\u9009\u62e9\u6765\u63a2\u7d22\u89e3\u7a7a\u95f4\u7684\u8fc7\u7a0b\u3002\u5c1d\u8bd5\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 Backtracking \u56de\u9000\u6307\u5728\u641c\u7d22\u4e2d\u9047\u5230\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u6216\u65e0\u6cd5\u7ee7\u7eed\u641c\u7d22\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\u7ed3\u70b9\u3001\u7ed3\u675f\u7ed3\u70b9\u8bbf\u95ee\u3001\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\u7ec8\u6b62\u641c\u7d22\uff0c\u51fd\u6570\u8fd4\u56de \u526a\u679d Pruning \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\u7ec8\u6b62\u7ee7\u7eed\u641c\u7d22

Tip

\u89e3\u3001\u72b6\u6001\u3001\u7ea6\u675f\u6761\u4ef6\u7b49\u672f\u8bed\u662f\u901a\u7528\u7684\uff0c\u9002\u7528\u4e8e\u56de\u6eaf\u7b97\u6cd5\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4. \u00a0 \u6846\u67b6\u4ee3\u7801","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\u4e3a\u63d0\u5347\u4ee3\u7801\u901a\u7528\u6027\uff0c\u6211\u4eec\u5e0c\u671b\u5c06\u56de\u6eaf\u7b97\u6cd5\u7684\u201c\u5c1d\u8bd5\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u4f53\u6846\u67b6\u63d0\u70bc\u51fa\u6765\u3002

\u8bbe state \u4e3a\u95ee\u9898\u7684\u5f53\u524d\u72b6\u6001\uff0cchoices \u8868\u793a\u5f53\u524d\u72b6\u6001\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9009\u62e9\uff0c\u5219\u53ef\u5f97\u5230\u4ee5\u4e0b\u56de\u6eaf\u7b97\u6cd5\u7684\u6846\u67b6\u4ee3\u7801\u3002

def backtrack(state, choices, res):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\"\"\"\n# \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif is_solution(state):\n# \u8bb0\u5f55\u89e3\nrecord_solution(state, res)\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices:\n# \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif is_valid(state, choice):\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmake_choice(state, choice)\nbacktrack(state, choices, res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundo_choice(state, choice)\n

\u4e0b\u9762\uff0c\u6211\u4eec\u5c1d\u8bd5\u57fa\u4e8e\u6b64\u6846\u67b6\u6765\u89e3\u51b3\u4f8b\u9898\u4e09\u3002\u5728\u4f8b\u9898\u4e09\u4e2d\uff0c\u72b6\u6001 state \u662f\u8282\u70b9\u904d\u5386\u8def\u5f84\uff0c\u9009\u62e9 choices \u662f\u5f53\u524d\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\uff0c\u7ed3\u679c res \u662f\u8def\u5f84\u5217\u8868\uff0c\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig backtrack_find_constrained_paths.java
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nboolean isSolution(List<TreeNode> state) {\nreturn !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\nres.add(new ArrayList<>(state));\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) {\nreturn choice != null && choice.val != 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\nstate.add(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\nstate.remove(state.size() - 1);\n}\n/* \u56de\u6eaf\u7b97\u6cd5 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (TreeNode choice : choices) {\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, choice);\nbacktrack(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\nundoChoice(state, choice);\n}\n}\n}\n
backtrack_find_constrained_paths.cpp
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\nreturn !state.empty() && state.back()->val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\nres.push_back(state);\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) {\nreturn choice != nullptr && choice->val != 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\nstate.push_back(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\nstate.pop_back();\n}\n/* \u56de\u6eaf\u7b97\u6cd5 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (TreeNode *choice : choices) {\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, choice);\nvector<TreeNode *> nextChoices{choice->left, choice->right};\nbacktrack(state, nextChoices, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state, choice);\n}\n}\n}\n
backtrack_find_constrained_paths.py
def is_solution(state: list[TreeNode]) -> bool:\n\"\"\"\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3\"\"\"\nreturn state and state[-1].val == 7\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n\"\"\"\u8bb0\u5f55\u89e3\"\"\"\nres.append(list(state))\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\"\"\"\nreturn choice is not None and choice.val != 3\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n\"\"\"\u66f4\u65b0\u72b6\u6001\"\"\"\nstate.append(choice)\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n\"\"\"\u6062\u590d\u72b6\u6001\"\"\"\nstate.pop()\ndef backtrack(state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\"\"\"\n# \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif is_solution(state):\n# \u8bb0\u5f55\u89e3\nrecord_solution(state, res)\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices:\n# \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif is_valid(state, choice):\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmake_choice(state, choice)\nbacktrack(state, [choice.left, choice.right], res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundo_choice(state, choice)\n
backtrack_find_constrained_paths.go
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.js
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.ts
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.c
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.cs
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state)\n{\nreturn state.Count != 0 && state[^1].val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res)\n{\nres.Add(new List<TreeNode>(state));\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{\nreturn choice != null && choice.val != 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice)\n{\nstate.Add(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice)\n{\nstate.RemoveAt(state.Count - 1);\n}\n/* \u56de\u6eaf\u7b97\u6cd5 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res)\n{\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state))\n{\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nforeach (TreeNode choice in choices)\n{\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, choice))\n{\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, choice);\nList<TreeNode> nextChoices = new List<TreeNode>() { choice.left, choice.right };\nbacktrack(state, nextChoices, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state, choice);\n}\n}\n}\n
backtrack_find_constrained_paths.swift
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.zig
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n

\u76f8\u8f83\u4e8e\u57fa\u4e8e\u524d\u5e8f\u904d\u5386\u7684\u5b9e\u73b0\u4ee3\u7801\uff0c\u57fa\u4e8e\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\u7684\u5b9e\u73b0\u4ee3\u7801\u867d\u7136\u663e\u5f97\u5570\u55e6\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u4e0d\u540c\u7684\u56de\u6eaf\u7b97\u6cd5\u95ee\u9898\u3002\u5b9e\u9645\u4e0a\uff0c\u6240\u6709\u56de\u6eaf\u95ee\u9898\u90fd\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u53ea\u9700\u8981\u6839\u636e\u95ee\u9898\u7279\u70b9\u6765\u5b9a\u4e49\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u53d8\u91cf\uff0c\u5b9e\u73b0\u5404\u4e2a\u65b9\u6cd5\u5373\u53ef\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5. \u00a0 \u5178\u578b\u4f8b\u9898","text":"

\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\u4e2a\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5706\u76d8\uff0c\u8981\u6c42\u5c06\u6240\u6709\u5706\u76d8\u4ece\u4e00\u4e2a\u67f1\u5b50\u79fb\u52a8\u5230\u53e6\u4e00\u4e2a\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

\u5728\u63a5\u4e0b\u6765\u7684\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4e00\u8d77\u653b\u514b\u51e0\u4e2a\u7ecf\u5178\u7684\u56de\u6eaf\u7b97\u6cd5\u95ee\u9898\u3002

"},{"location":"chapter_binary_search/binary_search/","title":"6.1. \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

\u300c\u4e8c\u5206\u67e5\u627e Binary Search\u300d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u6bcf\u8f6e\u51cf\u5c11\u4e00\u534a\u641c\u7d22\u8303\u56f4\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u3002\u6570\u7ec4\u7d22\u5f15\u7684\u53d6\u503c\u8303\u56f4\u4e3a\uff1a

\\[ 0, 1, 2, \\cdots, n-1 \\]

\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4ee5\u4e0b\u4e24\u79cd\u65b9\u6cd5\u6765\u8868\u793a\u8fd9\u4e2a\u53d6\u503c\u8303\u56f4\uff1a

  1. \u53cc\u95ed\u533a\u95f4 \\([0, n-1]\\) \uff0c\u5373\u4e24\u4e2a\u8fb9\u754c\u90fd\u5305\u542b\u81ea\u8eab\uff1b\u5728\u6b64\u65b9\u6cd5\u4e0b\uff0c\u533a\u95f4 \\([i, i]\\) \u4ecd\u5305\u542b \\(1\\) \u4e2a\u5143\u7d20\uff1b
  2. \u5de6\u95ed\u53f3\u5f00 \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\u3001\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\uff1b\u5728\u6b64\u65b9\u6cd5\u4e0b\uff0c\u533a\u95f4 \\([i, i)\\) \u4e0d\u5305\u542b\u5143\u7d20\uff1b
"},{"location":"chapter_binary_search/binary_search/#611","title":"6.1.1. \u00a0 \u53cc\u95ed\u533a\u95f4\u5b9e\u73b0","text":"

\u9996\u5148\uff0c\u6211\u4eec\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u6cd5\uff0c\u5728\u6570\u7ec4 nums \u4e2d\u67e5\u627e\u76ee\u6807\u5143\u7d20 target \u7684\u5bf9\u5e94\u7d22\u5f15\u3002

<1><2><3><4><5><6><7>

\u4e8c\u5206\u67e5\u627e\u5728\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u4e0b\u7684\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint 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\nwhile (i <= j) {\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\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\nint 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\nwhile (i <= j) {\nint m = (i + j) / 2;  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
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\ni, j = 0, len(nums) - 1\nwhile i <= j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\nelif nums[m] > target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\nelse:\nreturn m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\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\ni, 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\nfor i <= j {\nm := (i + j) / 2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -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\nlet i = 0,\nj = 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\nwhile (i <= j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\nconst m = parseInt((i + j) / 2);\nif (nums[m] < target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse 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\nreturn -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\nlet i = 0,\nj = 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\nwhile (i <= j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nconst m = Math.floor((i + j) / 2);\nif (nums[m] < target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\n} else if (nums[m] > target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\n} else {\n// \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n}\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -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 left, right \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\nint left = 0, right = len - 1;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 left > right \u65f6\u4e3a\u7a7a\uff09\nwhile (left <= right) {\nint mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 mid\nif (nums[mid] < target)       // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [mid+1, right] \u4e2d\nleft = mid + 1;\nelse if (nums[mid] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [left, mid-1] \u4e2d\nright = mid - 1;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn mid;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target)\n{\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\nint 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\nwhile (i <= j)\n{\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -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\nvar i = 0\nvar j = nums.count - 1\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\nwhile i <= j {\nlet m = (i + j) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\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\nvar i: usize = 0;\nvar 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\nwhile (i <= j) {\nvar m = (i + j) / 2;                    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\n} else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\n} else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn @intCast(T, m);\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u6570\u7ec4\u957f\u5ea6\u975e\u5e38\u5927\u65f6\uff0c\u52a0\u6cd5 \\(i + j\\) \u7684\u7ed3\u679c\u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u9700\u8981\u91c7\u7528\u4e00\u79cd\u66f4\u5b89\u5168\u7684\u8ba1\u7b97\u4e2d\u70b9\u7684\u65b9\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
# Python \u4e2d\u7684\u6570\u5b57\u7406\u8bba\u4e0a\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\n# \u56e0\u6b64\u65e0\u9700\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nm := (i + j) / 2\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nm := i + (j - i) / 2\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nlet m = parseInt((i + j) / 2);\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nlet m = parseInt(i + (j - i) / 2);\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa Number \u7684\u53d6\u503c\u8303\u56f4\nlet m = Math.floor((i + j) / 2);\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nlet m = Math.floor(i + (j - i) / 2);\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nlet m = (i + j) / 2\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nlet m = i + (j - 1) / 2\n
\n
"},{"location":"chapter_binary_search/binary_search/#612","title":"6.1.2. \u00a0 \u5de6\u95ed\u53f3\u5f00\u5b9e\u73b0","text":"

\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u7684\u8868\u793a\u6cd5\uff0c\u7f16\u5199\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search.java
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(int[] nums, int target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint 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\nwhile (i < j) {\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.cpp
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(vector<int> &nums, int target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint 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\nwhile (i < j) {\nint m = (i + j) / 2;  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.py
def binary_search1(nums: list[int], target: int) -> int:\n\"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09\"\"\"\n# \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\ni, 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\nwhile i < j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1\nelif nums[m] > target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m\nelse:  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.go
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunc binarySearch1(nums []int, target int) int {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\ni, 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\nfor i < j {\nm := (i + j) / 2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\n
binary_search.js
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunction binarySearch1(nums, target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nlet i = 0,\nj = nums.length;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\nwhile (i < j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\nconst m = parseInt((i + j) / 2);\nif (nums[m] < target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\n// \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nelse return m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunction binarySearch1(nums: number[], target: number): number {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nlet i = 0,\nj = nums.length;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\nwhile (i < j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nconst m = Math.floor((i + j) / 2);\nif (nums[m] < target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\n} else if (nums[m] > target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\n} else {\n// \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n}\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.c
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(int *nums, int len, int target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 left, right \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint left = 0, right = len;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 left = right \u65f6\u4e3a\u7a7a\uff09\nwhile (left < right) {\nint mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 mid\nif (nums[mid] < target)       // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [mid+1, right) \u4e2d\nleft = mid + 1;\nelse if (nums[mid] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [left, mid) \u4e2d\nright = mid;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn mid;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(int[] nums, int target)\n{\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint 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\nwhile (i < j)\n{\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.swift
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunc binarySearch1(nums: [Int], target: Int) -> Int {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nvar i = 0\nvar j = nums.count\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\nwhile i < j {\nlet m = (i + j) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\n
binary_search.zig
// \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09\nfn binarySearch1(comptime T: type, nums: std.ArrayList(T), target: T) T {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nvar i: usize = 0;\nvar 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\nwhile (i <= j) {\nvar m = (i + j) / 2;                    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\n} else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\n} else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn @intCast(T, m);\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n

\u5bf9\u6bd4\u8fd9\u4e24\u79cd\u4ee3\u7801\u5199\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u53d1\u73b0\u4ee5\u4e0b\u4e0d\u540c\u70b9\uff1a

\u8868\u793a\u65b9\u6cd5 \u521d\u59cb\u5316\u6307\u9488 \u7f29\u5c0f\u533a\u95f4 \u5faa\u73af\u7ec8\u6b62\u6761\u4ef6 \u53cc\u95ed\u533a\u95f4 \\([0, n-1]\\) \\(i = 0\\) , \\(j = n-1\\) \\(i = m + 1\\) , \\(j = m - 1\\) \\(i > j\\) \u5de6\u95ed\u53f3\u5f00 \\([0, n)\\) \\(i = 0\\) , \\(j = n\\) \\(i = m + 1\\) , \\(j = m\\) \\(i = j\\)

\u5728\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u6cd5\u4e2d\uff0c\u7531\u4e8e\u5bf9\u5de6\u53f3\u4e24\u8fb9\u754c\u7684\u5b9a\u4e49\u76f8\u540c\uff0c\u56e0\u6b64\u7f29\u5c0f\u533a\u95f4\u7684 \\(i\\) \u548c \\(j\\) \u7684\u5904\u7406\u65b9\u6cd5\u4e5f\u662f\u5bf9\u79f0\u7684\uff0c\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\u3002\u56e0\u6b64\uff0c\u5efa\u8bae\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

"},{"location":"chapter_binary_search/binary_search/#613","title":"6.1.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(\\log n)\\) \uff1a\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u957f\u5ea6\uff1b\u6bcf\u8f6e\u6392\u9664\u4e00\u534a\u7684\u533a\u95f4\uff0c\u56e0\u6b64\u5faa\u73af\u8f6e\u6570\u4e3a \\(\\log_2 n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \uff1a\u6307\u9488 i , j \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7a7a\u95f4\u3002

"},{"location":"chapter_binary_search/binary_search/#614","title":"6.1.4. \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u5206\u67e5\u627e\u6548\u7387\u5f88\u9ad8\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\uff1a

  • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u8f83\u4f4e\u3002\u5bf9\u6570\u9636\u5728\u5927\u6570\u636e\u91cf\u60c5\u51b5\u4e0b\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\u9700\u989d\u5916\u7a7a\u95f4\u3002\u4e0e\u54c8\u5e0c\u67e5\u627e\u76f8\u6bd4\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

\u7136\u800c\uff0c\u5e76\u975e\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u53ef\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\uff0c\u539f\u56e0\u5982\u4e0b\uff1a

  • \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\u8981 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_computational_complexity/performance_evaluation/","title":"2.1. \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30","text":""},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1. \u00a0 \u7b97\u6cd5\u8bc4\u4ef7\u7ef4\u5ea6","text":"

\u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u7b97\u6cd5\u8bbe\u8ba1\u8ffd\u6c42\u4ee5\u4e0b\u4e24\u4e2a\u5c42\u9762\u7684\u76ee\u6807\uff1a

  1. \u627e\u5230\u95ee\u9898\u89e3\u6cd5\u3002\u7b97\u6cd5\u9700\u8981\u5728\u89c4\u5b9a\u7684\u8f93\u5165\u8303\u56f4\u5185\uff0c\u53ef\u9760\u5730\u6c42\u5f97\u95ee\u9898\u7684\u6b63\u786e\u89e3\u3002
  2. \u5bfb\u6c42\u6700\u4f18\u89e3\u6cd5\u3002\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

\u56e0\u6b64\uff0c\u5728\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u7684\u524d\u63d0\u4e0b\uff0c\u7b97\u6cd5\u6548\u7387\u6210\u4e3a\u4e3b\u8981\u7684\u8bc4\u4ef7\u7ef4\u5ea6\uff0c\u4e3b\u8981\u5305\u62ec\uff1a

  • \u65f6\u95f4\u6548\u7387\uff0c\u5373\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
  • \u7a7a\u95f4\u6548\u7387\uff0c\u5373\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\u638c\u63e1\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u7684\u65b9\u6cd5\u5219\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u53ea\u6709\u4e86\u89e3\u8bc4\u4ef7\u6807\u51c6\uff0c\u6211\u4eec\u624d\u80fd\u8fdb\u884c\u7b97\u6cd5\u4e4b\u95f4\u7684\u5bf9\u6bd4\u5206\u6790\uff0c\u4ece\u800c\u6307\u5bfc\u7b97\u6cd5\u8bbe\u8ba1\u4e0e\u4f18\u5316\u8fc7\u7a0b\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2. \u00a0 \u6548\u7387\u8bc4\u4f30\u65b9\u6cd5","text":""},{"location":"chapter_computational_complexity/performance_evaluation/#_1","title":"\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\u6211\u4eec\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u5c31\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\u5c40\u9650\u6027\u3002

\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\u8868\u73b0\u3002\u4f8b\u5982\uff0c\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\u6211\u4eec\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\u800c\u8fd9\u662f\u4e0d\u73b0\u5b9e\u7684\u3002

\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\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u53ef\u80fd\u77ed\u4e8e\u7b97\u6cd5 B\uff1b\u800c\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5927\u65f6\uff0c\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\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\u8fd9\u6837\u9700\u8981\u5360\u7528\u5927\u91cf\u7684\u8ba1\u7b97\u8d44\u6e90\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#_2","title":"\u7406\u8bba\u4f30\u7b97","text":"

\u7531\u4e8e\u5b9e\u9645\u6d4b\u8bd5\u5177\u6709\u8f83\u5927\u7684\u5c40\u9650\u6027\uff0c\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\u300c\u590d\u6742\u5ea6\u5206\u6790 Complexity Analysis\u300d\u6216\u300c\u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 Asymptotic Complexity Analysis\u300d\u3002

\u590d\u6742\u5ea6\u5206\u6790\u8bc4\u4f30\u7684\u662f\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u589e\u591a\u65f6\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\uff1a

  • \u201c\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u201d\u53ef\u5206\u4e3a\u201c\u8fd0\u884c\u65f6\u95f4\u201d\u548c\u201c\u5360\u7528\u7a7a\u95f4\u201d\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5c06\u590d\u6742\u5ea6\u5206\u4e3a\u300c\u65f6\u95f4\u590d\u6742\u5ea6 Time Complexity\u300d\u548c\u300c\u7a7a\u95f4\u590d\u6742\u5ea6 Space Complexity\u300d\uff1b
  • \u201c\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u589e\u591a\u65f6\u201d\u8868\u793a\u590d\u6742\u5ea6\u4e0e\u8f93\u5165\u6570\u636e\u91cf\u6709\u5173\uff0c\u53cd\u6620\u4e86\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u4e0e\u8f93\u5165\u6570\u636e\u91cf\u4e4b\u95f4\u7684\u5173\u7cfb\uff1b
  • \u201c\u589e\u957f\u8d8b\u52bf\u201d\u8868\u793a\u590d\u6742\u5ea6\u5206\u6790\u5173\u6ce8\u7684\u662f\u7b97\u6cd5\u65f6\u95f4\u4e0e\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\uff0c\u800c\u975e\u5177\u4f53\u7684\u8fd0\u884c\u65f6\u95f4\u6216\u5360\u7528\u7a7a\u95f4\uff1b

\u590d\u6742\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5b9e\u9645\u6d4b\u8bd5\u65b9\u6cd5\u7684\u5f0a\u7aef\u3002\u9996\u5148\uff0c\u5b83\u72ec\u7acb\u4e8e\u6d4b\u8bd5\u73af\u5883\uff0c\u56e0\u6b64\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\u3002\u5176\u6b21\uff0c\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

\u5982\u679c\u4f60\u5bf9\u590d\u6742\u5ea6\u5206\u6790\u7684\u6982\u5ff5\u4ecd\u611f\u5230\u56f0\u60d1\uff0c\u65e0\u9700\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u7ae0\u8282\u8be6\u7ec6\u4ecb\u7ecd\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#213","title":"2.1.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790\u91cd\u8981\u6027","text":"

\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\u544a\u8bc9\u6211\u4eec\u6267\u884c\u67d0\u4e2a\u7b97\u6cd5\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\uff0c\u5e76\u4f7f\u6211\u4eec\u80fd\u591f\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\u7b2c\u4e00\u7ae0\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\u6211\u4eec\u96be\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u8fd0\u884c\u901f\u5ea6\u548c\u7a7a\u95f4\u4f7f\u7528\u60c5\u51b5\u3002\u56e0\u6b64\uff0c\u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u524d\uff0c\u5efa\u8bae\u8bfb\u8005\u5148\u5bf9\u590d\u6742\u5ea6\u5efa\u7acb\u521d\u6b65\u7684\u4e86\u89e3\uff0c\u5e76\u80fd\u591f\u5b8c\u6210\u7b80\u5355\u6848\u4f8b\u7684\u590d\u6742\u5ea6\u5206\u6790\u3002

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.3. \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6","text":"

\u300c\u7a7a\u95f4\u590d\u6742\u5ea6 Space Complexity\u300d\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u4f7f\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\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#231","title":"2.3.1. \u00a0 \u7b97\u6cd5\u76f8\u5173\u7a7a\u95f4","text":"

\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\uff1a

  • \u300c\u8f93\u5165\u7a7a\u95f4\u300d\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u5165\u6570\u636e\uff1b
  • \u300c\u6682\u5b58\u7a7a\u95f4\u300d\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u53d8\u91cf\u3001\u5bf9\u8c61\u3001\u51fd\u6570\u4e0a\u4e0b\u6587\u7b49\u6570\u636e\uff1b
  • \u300c\u8f93\u51fa\u7a7a\u95f4\u300d\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u51fa\u6570\u636e\uff1b

\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7edf\u8ba1\u8303\u56f4\u662f\u300c\u6682\u5b58\u7a7a\u95f4\u300d+\u300c\u8f93\u51fa\u7a7a\u95f4\u300d\u3002

\u6682\u5b58\u7a7a\u95f4\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a

  • \u300c\u6682\u5b58\u6570\u636e\u300d\u7528\u4e8e\u4fdd\u5b58\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5404\u79cd\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u7b49\u3002
  • \u300c\u6808\u5e27\u7a7a\u95f4\u300d\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
  • \u300c\u6307\u4ee4\u7a7a\u95f4\u300d\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

\u56e0\u6b64\uff0c\u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5e8f\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u65f6\uff0c\u6211\u4eec\u4e00\u822c\u7edf\u8ba1 \u6682\u5b58\u6570\u636e\u3001\u8f93\u51fa\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4 \u4e09\u90e8\u5206\u3002

Fig. \u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u5173\u7a7a\u95f4

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u7c7b */\nclass Node {\nint val;\nNode next;\nNode(int x) { val = x; }\n}\n/* \u51fd\u6570 */\nint function() {\n// do something...\nreturn 0;\n}\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\nfinal int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nNode node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nint c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7ed3\u6784\u4f53 */\nstruct Node {\nint val;\nNode *next;\nNode(int x) : val(x), next(nullptr) {}\n};\n/* \u51fd\u6570 */\nint func() {\n// do something...\nreturn 0;\n}\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\nconst int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nNode* node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nint c = func();           // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
class Node:\n\"\"\"\u7c7b\"\"\"\ndef __init__(self, x: int):\nself.val: int = x                 # \u8282\u70b9\u503c\nself.next: Optional[Node] = None  # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\ndef function() -> int:\n\"\"\"\u51fd\u6570\"\"\"\n# do something...\nreturn 0\ndef algorithm(n) -> int:  # \u8f93\u5165\u6570\u636e\nA: int = 0            # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\nb: int = 0            # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nnode = Node(0)        # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nc: int = function()   # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn A + b + c      # \u8f93\u51fa\u6570\u636e\n
/* \u7ed3\u6784\u4f53 */\ntype node struct {\nval  int\nnext *node\n}\n/* \u521b\u5efa node \u7ed3\u6784\u4f53  */\nfunc newNode(val int) *node {\nreturn &node{val: val}\n}\n/* \u51fd\u6570 */\nfunc function() int {\n// do something...\nreturn 0\n}\nfunc algorithm(n int) int { // \u8f93\u5165\u6570\u636e\nconst a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nb := 0                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nnewNode(0)              // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nc := function()         // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c        // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\nval;\nnext;\nconstructor(val) {\nthis.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\nthis.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n/* \u51fd\u6570 */\nfunction constFunc() {\n// do something\nreturn 0;\n}\nfunction algorithm(n) {       // \u8f93\u5165\u6570\u636e\nconst a = 0;              // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nlet b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nconst node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nconst c = constFunc();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\nval: number;\nnext: Node | null;\nconstructor(val?: number) {\nthis.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\nthis.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n/* \u51fd\u6570 */\nfunction constFunc(): number {\n// do something\nreturn 0;\n}\nfunction algorithm(n: number): number { // \u8f93\u5165\u6570\u636e\nconst a = 0;                        // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nlet b = 0;                          // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nconst node = new Node(0);           // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nconst c = constFunc();              // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;                   // \u8f93\u51fa\u6570\u636e\n}\n
/* \u51fd\u6570 */\nint func() {\n// do something...\nreturn 0;\n}\nint algorithm(int n) { // \u8f93\u5165\u6570\u636e\nconst int a = 0;   // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;         // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nint c = func();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;  // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node\n{\nint val;\nNode next;\nNode(int x) { val = x; }\n}\n/* \u51fd\u6570 */\nint function()\n{\n// do something...\nreturn 0;\n}\nint algorithm(int n)          // \u8f93\u5165\u6570\u636e\n{\nconst int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nNode node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nint c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\nvar val: Int\nvar next: Node?\ninit(x: Int) {\nval = x\n}\n}\n/* \u51fd\u6570 */\nfunc function() -> Int {\n// do something...\nreturn 0\n}\nfunc algorithm(n: Int) -> Int { // \u8f93\u5165\u6570\u636e\nlet a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nvar b = 0             // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nlet node = Node(x: 0) // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nlet c = function()    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c      // \u8f93\u51fa\u6570\u636e\n}\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#232","title":"2.3.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\u662f\u5c06\u7edf\u8ba1\u5bf9\u8c61\u4ece\u201c\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u201d\u8f6c\u4e3a\u201c\u4f7f\u7528\u7a7a\u95f4\u5927\u5c0f\u201d\u3002\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u300c\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u300d\uff0c\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

\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u4e24\u5c42\u542b\u4e49\uff0c\u5206\u522b\u662f\u8f93\u5165\u6570\u636e\u7684\u6700\u5dee\u5206\u5e03\u548c\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u6700\u5dee\u65f6\u95f4\u70b9\u3002

  • \u4ee5\u6700\u5dee\u8f93\u5165\u6570\u636e\u4e3a\u51c6\u3002\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\uff1b\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b
  • \u4ee5\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5cf0\u503c\u5185\u5b58\u4e3a\u51c6\u3002\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\uff1b\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
void algorithm(int n) {\nint a = 0;                   // O(1)\nint[] b = new int[10000];    // O(1)\nif (n > 10)\nint[] nums = new int[n]; // O(n)\n}\n
void algorithm(int n) {\nint a = 0;               // O(1)\nvector<int> b(10000);    // O(1)\nif (n > 10)\nvector<int> nums(n); // O(n)\n}\n
def algorithm(n: int) -> None:\na: int = 0                     # O(1)\nb: List[int] = [0] * 10000     # O(1)\nif n > 10:\nnums: List[int] = [0] * n  # O(n)\n
func algorithm(n int) {\na := 0                      // O(1)\nb := make([]int, 10000)     // O(1)\nvar nums []int\nif n > 10 {\nnums := make([]int, n)  // O(n)\n}\nfmt.Println(a, b, nums)\n}\n
function algorithm(n) {\nconst a = 0;                   // O(1)\nconst b = new Array(10000);    // O(1)\nif (n > 10) {\nconst nums = new Array(n); // O(n)\n}\n}\n
function algorithm(n: number): void {\nconst a = 0;                   // O(1)\nconst b = new Array(10000);    // O(1)\nif (n > 10) {\nconst nums = new Array(n); // O(n)\n}\n}\n
void algorithm(int n) {\nint a = 0;               // O(1)\nint b[10000];            // O(1)\nif (n > 10)\nvector<int> nums(n); // O(n)\n}\n
void algorithm(int n)\n{\nint a = 0;                   // O(1)\nint[] b = new int[10000];    // O(1)\nif (n > 10)\n{\nint[] nums = new int[n]; // O(n)\n}\n}\n
func algorithm(n: Int) {\nlet a = 0 // O(1)\nlet b = Array(repeating: 0, count: 10000) // O(1)\nif n > 10 {\nlet nums = Array(repeating: 0, count: n) // O(n)\n}\n}\n
\n

\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7edf\u8ba1\u6808\u5e27\u7a7a\u95f4\u3002\u4f8b\u5982\uff0c\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\u800c\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
int function() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n) {\nfor (int i = 0; i < n; i++) {\nfunction();\n}\n}\n/* \u9012\u5f52 O(n) */\nvoid recur(int n) {\nif (n == 1) return;\nreturn recur(n - 1);\n}\n
int func() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n) {\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nvoid recur(int n) {\nif (n == 1) return;\nreturn recur(n - 1);\n}\n
def function() -> int:\n# do something\nreturn 0\ndef loop(n: int) -> None:\n\"\"\"\u5faa\u73af O(1)\"\"\"\nfor _ in range(n):\nfunction()\ndef recur(n: int) -> int:\n\"\"\"\u9012\u5f52 O(n)\"\"\"\nif n == 1: return\nreturn recur(n - 1)\n
func function() int {\n// do something\nreturn 0\n}\n/* \u5faa\u73af O(1) */\nfunc loop(n int) {\nfor i := 0; i < n; i++ {\nfunction()\n}\n}\n/* \u9012\u5f52 O(n) */\nfunc recur(n int) {\nif n == 1 {\nreturn\n}\nrecur(n - 1)\n}\n
function constFunc() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nfunction loop(n) {\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nfunction recur(n) {\nif (n === 1) return;\nreturn recur(n - 1);\n}\n
function constFunc(): number {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nfunction loop(n: number): void {\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nfunction recur(n: number): void {\nif (n === 1) return;\nreturn recur(n - 1);\n}\n
int func() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n) {\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nvoid recur(int n) {\nif (n == 1) return;\nreturn recur(n - 1);\n}\n
int function()\n{\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n)\n{\nfor (int i = 0; i < n; i++)\n{\nfunction();\n}\n}\n/* \u9012\u5f52 O(n) */\nint recur(int n)\n{\nif (n == 1) return 1;\nreturn recur(n - 1);\n}\n
@discardableResult\nfunc function() -> Int {\n// do something\nreturn 0\n}\n/* \u5faa\u73af O(1) */\nfunc loop(n: Int) {\nfor _ in 0 ..< n {\nfunction()\n}\n}\n/* \u9012\u5f52 O(n) */\nfunc recur(n: Int) {\nif n == 1 {\nreturn\n}\nrecur(n: n - 1)\n}\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#233","title":"2.3.3. \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u6709\uff08\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\uff09

\\[ \\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} \\]

Fig. \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u89c1\u7c7b\u578b

Tip

\u90e8\u5206\u793a\u4f8b\u4ee3\u7801\u9700\u8981\u4e00\u4e9b\u524d\u7f6e\u77e5\u8bc6\uff0c\u5305\u62ec\u6570\u7ec4\u3001\u94fe\u8868\u3001\u4e8c\u53c9\u6811\u3001\u9012\u5f52\u7b97\u6cd5\u7b49\u3002\u5982\u679c\u9047\u5230\u770b\u4e0d\u61c2\u7684\u5730\u65b9\u65e0\u9700\u62c5\u5fc3\uff0c\u53ef\u4ee5\u5728\u5b66\u4e60\u5b8c\u540e\u9762\u7ae0\u8282\u540e\u518d\u6765\u590d\u4e60\uff0c\u73b0\u9636\u6bb5\u6211\u4eec\u5148\u4e13\u6ce8\u4e8e\u7406\u89e3\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u542b\u4e49\u548c\u63a8\u7b97\u65b9\u6cd5\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#o1","title":"\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\u5373\u4e0d\u4f1a\u7d2f\u79ef\u5360\u7528\u7a7a\u95f4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nfinal int a = 0;\nint b = 0;\nint[] nums = new int[10000];\nListNode node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nfunction();\n}\n}\n
space_complexity.cpp
/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst int a = 0;\nint b = 0;\nvector<int> nums(10000);\nListNode node(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n
space_complexity.py
def constant(n: int) -> None:\n\"\"\"\u5e38\u6570\u9636\"\"\"\n# \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\na: int = 0\nnums: list[int] = [0] * 10000\nnode = ListNode(0)\n# \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in range(n):\nc: int = 0\n# \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in range(n):\nfunction()\n
space_complexity.go
/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a = 0\nb := 0\nnums := make([]int, 10000)\nListNode := newNode(0)\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nvar c int\nfor i := 0; i < n; i++ {\nc = 0\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor i := 0; i < n; i++ {\nfunction()\n}\nfmt.Println(a, b, nums, c, ListNode)\n}\n
space_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a = 0;\nconst b = 0;\nconst nums = new Array(10000);\nconst node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconst c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n
space_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a = 0;\nconst b = 0;\nconst nums = new Array(10000);\nconst node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconst c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n
space_complexity.c
/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst int a = 0;\nint b = 0;\nint nums[1000];\nListNode *node = newListNode(0);\nfree(node);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n
space_complexity.cs
/* \u5e38\u6570\u9636 */\nvoid constant(int n)\n{\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nint a = 0;\nint b = 0;\nint[] nums = new int[10000];\nListNode node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++)\n{\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++)\n{\nfunction();\n}\n}\n
space_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nlet a = 0\nvar b = 0\nlet nums = Array(repeating: 0, count: 10000)\nlet node = ListNode(x: 0)\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in 0 ..< n {\nlet c = 0\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in 0 ..< n {\nfunction()\n}\n}\n
space_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a: i32 = 0;\nvar b: i32 = 0;\nvar nums = [_]i32{0}**10000;\nvar node = inc.ListNode(i32){.val = 0};\nvar i: i32 = 0;\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nwhile (i < n) : (i += 1) {\nvar c: i32 = 0;\n_ = c;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\ni = 0;\nwhile (i < n) : (i += 1) {\n_ = function();\n}\n_ = a;\n_ = b;\n_ = nums;\n_ = node;\n}\n
"},{"location":"chapter_computational_complexity/space_complexity/#on","title":"\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n// \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\nint[] nums = new int[n];\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nList<ListNode> nodes = new ArrayList<>();\nfor (int i = 0; i < n; i++) {\nnodes.add(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nMap<Integer, String> map = new HashMap<>();\nfor (int i = 0; i < n; i++) {\nmap.put(i, String.valueOf(i));\n}\n}\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\nvector<int> nums(n);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nvector<ListNode> nodes;\nfor (int i = 0; i < n; i++) {\nnodes.push_back(ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nunordered_map<int, string> map;\nfor (int i = 0; i < n; i++) {\nmap[i] = to_string(i);\n}\n}\n
space_complexity.py
def linear(n: int) -> None:\n\"\"\"\u7ebf\u6027\u9636\"\"\"\n# \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nnums: list[int] = [0] * n\n# \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nmapp = dict[int, str]()\nfor i in range(n):\nmapp[i] = str(i)\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\nvar nodes []*node\nfor i := 0; i < n; i++ {\nnodes = append(nodes, newNode(i))\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nm := make(map[int]string, n)\nfor i := 0; i < n; i++ {\nm[i] = strconv.Itoa(i)\n}\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\nconst nums = new Array(n);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst nodes = [];\nfor (let i = 0; i < n; i++) {\nnodes.push(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst map = new Map();\nfor (let i = 0; i < n; i++) {\nmap.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\nconst nums = new Array(n);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst nodes: ListNode[] = [];\nfor (let i = 0; i < n; i++) {\nnodes.push(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst map = new Map();\nfor (let i = 0; i < n; i++) {\nmap.set(i, i.toString());\n}\n}\n
space_complexity.c
/* \u54c8\u5e0c\u8868 */\nstruct hashTable {\nint key;\nint val;\nUT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n};\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n// \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\nint *nums = malloc(sizeof(int) * n);\nfree(nums);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nListNode **nodes = malloc(sizeof(ListNode *) * n);\nfor (int i = 0; i < n; i++) {\nnodes[i] = newListNode(i);\n}\n// \u5185\u5b58\u91ca\u653e\nfor (int i = 0; i < n; i++) {\nfree(nodes[i]);\n}\nfree(nodes);\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nhashTable *h = NULL;\nfor (int i = 0; i < n; i++) {\nhashTable *tmp = malloc(sizeof(hashTable));\ntmp->key = i;\ntmp->val = i;\nHASH_ADD_INT(h, key, tmp);\n}\n// \u5185\u5b58\u91ca\u653e\nhashTable *curr, *tmp;\nHASH_ITER(hh, h, curr, tmp) {\nHASH_DEL(h, curr);\nfree(curr);\n}\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636 */\nvoid linear(int n)\n{\n// \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\nint[] nums = new int[n];\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nList<ListNode> nodes = new();\nfor (int i = 0; i < n; i++)\n{\nnodes.Add(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nDictionary<int, String> map = new();\nfor (int i = 0; i < n; i++)\n{\nmap.Add(i, i.ToString());\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\nlet nums = Array(repeating: 0, count: n)\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nlet nodes = (0 ..< n).map { ListNode(x: $0) }\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nlet map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\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\nvar nums = [_]i32{0}**n;\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nvar nodes = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nodes.deinit();\nvar i: i32 = 0;\nwhile (i < n) : (i += 1) {\ntry nodes.append(i);\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nvar map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\ndefer map.deinit();\nvar j: i32 = 0;\nwhile (j < n) : (j += 1) {\nconst string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\ndefer std.heap.page_allocator.free(string);\ntry map.put(i, string);\n}\n_ = nums;\n}\n

\u4ee5\u4e0b\u9012\u5f52\u51fd\u6570\u4f1a\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 algorithm() \u51fd\u6570\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\nSystem.out.println(\"\u9012\u5f52 n = \" + n);\nif (n == 1)\nreturn;\nlinearRecur(n - 1);\n}\n
space_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\ncout << \"\u9012\u5f52 n = \" << n << endl;\nif (n == 1)\nreturn;\nlinearRecur(n - 1);\n}\n
space_complexity.py
def linear_recur(n: int) -> None:\n\"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nprint(\"\u9012\u5f52 n =\", n)\nif n == 1:\nreturn\nlinear_recur(n - 1)\n
space_complexity.go
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\nfmt.Println(\"\u9012\u5f52 n =\", n)\nif n == 1 {\nreturn\n}\nspaceLinearRecur(n - 1)\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\nconsole.log(`\u9012\u5f52 n = ${n}`);\nif (n === 1) return;\nlinearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\nconsole.log(`\u9012\u5f52 n = ${n}`);\nif (n === 1) return;\nlinearRecur(n - 1);\n}\n
space_complexity.c
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\nprintf(\"\u9012\u5f52 n = %d\\r\\n\", n);\nif (n == 1)\nreturn;\nlinearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n)\n{\nConsole.WriteLine(\"\u9012\u5f52 n = \" + n);\nif (n == 1) return;\nlinearRecur(n - 1);\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\nprint(\"\u9012\u5f52 n = \\(n)\")\nif n == 1 {\nreturn\n}\nlinearRecur(n: n - 1)\n}\n
space_complexity.zig
// \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\nstd.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\nif (n == 1) return;\nlinearRecur(n - 1);\n}\n

Fig. \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u7ebf\u6027\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#on2","title":"\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nint[][] numMatrix = new int[n][n];\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nList<List<Integer>> numList = new ArrayList<>();\nfor (int i = 0; i < n; i++) {\nList<Integer> tmp = new ArrayList<>();\nfor (int j = 0; j < n; j++) {\ntmp.add(0);\n}\nnumList.add(tmp);\n}\n}\n
space_complexity.cpp
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nvector<vector<int>> numMatrix;\nfor (int i = 0; i < n; i++) {\nvector<int> tmp;\nfor (int j = 0; j < n; j++) {\ntmp.push_back(0);\n}\nnumMatrix.push_back(tmp);\n}\n}\n
space_complexity.py
def quadratic(n: int) -> None:\n\"\"\"\u5e73\u65b9\u9636\"\"\"\n# \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nnum_matrix: list[list[int]] = [[0] * n for _ in range(n)]\n
space_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nnumMatrix := make([][]int, n)\nfor i := 0; i < n; i++ {\nnumMatrix[i] = make([]int, n)\n}\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nconst numMatrix = Array(n)\n.fill(null)\n.map(() => Array(n).fill(null));\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nconst numList = [];\nfor (let i = 0; i < n; i++) {\nconst tmp = [];\nfor (let j = 0; j < n; j++) {\ntmp.push(0);\n}\nnumList.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\nconst numMatrix = Array(n)\n.fill(null)\n.map(() => Array(n).fill(null));\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nconst numList = [];\nfor (let i = 0; i < n; i++) {\nconst tmp = [];\nfor (let j = 0; j < n; j++) {\ntmp.push(0);\n}\nnumList.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\nint **numMatrix = malloc(sizeof(int *) * n);\nfor (int i = 0; i < n; i++) {\nint *tmp = malloc(sizeof(int) * n);\nfor (int j = 0; j < n; j++) {\ntmp[j] = 0;\n}\nnumMatrix[i] = tmp;\n}\n// \u5185\u5b58\u91ca\u653e\nfor (int i = 0; i < n; i++) {\nfree(numMatrix[i]);\n}\nfree(numMatrix);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n)\n{\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nint[,] numMatrix = new int[n, n];\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nList<List<int>> numList = new();\nfor (int i = 0; i < n; i++)\n{\nList<int> tmp = new();\nfor (int j = 0; j < n; j++)\n{\ntmp.Add(0);\n}\nnumList.Add(tmp);\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\nlet numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nvar nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\ndefer nodes.deinit();\nvar i: i32 = 0;\nwhile (i < n) : (i += 1) {\nvar tmp = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer tmp.deinit();\nvar j: i32 = 0;\nwhile (j < n) : (j += 1) {\ntry tmp.append(0);\n}\ntry nodes.append(tmp);\n}\n}\n

\u5728\u4ee5\u4e0b\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 algorithm() \uff0c\u5e76\u4e14\u6bcf\u4e2a\u51fd\u6570\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u957f\u5ea6\u5206\u522b\u4e3a \\(n, n-1, n-2, ..., 2, 1\\) \uff0c\u5e73\u5747\u957f\u5ea6\u4e3a \\(\\frac{n}{2}\\) \uff0c\u56e0\u6b64\u603b\u4f53\u5360\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\nif (n <= 0)\nreturn 0;\n// \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\nint[] nums = new int[n];\nSystem.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\nif (n <= 0)\nreturn 0;\nvector<int> nums(n);\ncout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.py
def quadratic_recur(n: int) -> int:\n\"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n <= 0:\nreturn 0\n# \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\nnums: list[int] = [0] * n\nreturn quadratic_recur(n - 1)\n
space_complexity.go
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\nif n <= 0 {\nreturn 0\n}\nnums := make([]int, n)\nfmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\nreturn spaceQuadraticRecur(n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\nif (n <= 0) return 0;\nconst nums = new Array(n);\nconsole.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\nif (n <= 0) return 0;\nconst nums = new Array(n);\nconsole.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\nif (n <= 0)\nreturn 0;\nint *nums = malloc(sizeof(int) * n);\nprintf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\nfree(nums);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n)\n{\nif (n <= 0) return 0;\nint[] nums = new int[n];\nConsole.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\nif n <= 0 {\nreturn 0\n}\n// \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\nlet nums = Array(repeating: 0, count: n)\nprint(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\nreturn quadraticRecur(n: n - 1)\n}\n
space_complexity.zig
// \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\nif (n <= 0) return 0;\nvar nums = [_]i32{0}**n;\nstd.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\nreturn quadraticRecur(n - 1);\n}\n

Fig. \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u5e73\u65b9\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#o2n","title":"\u6307\u6570\u9636 \\(O(2^n)\\)","text":"

\u6307\u6570\u9636\u5e38\u89c1\u4e8e\u4e8c\u53c9\u6811\u3002\u9ad8\u5ea6\u4e3a \\(n\\) \u7684\u300c\u6ee1\u4e8c\u53c9\u6811\u300d\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(2^n - 1\\) \uff0c\u5360\u7528 \\(O(2^n)\\) \u7a7a\u95f4\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\nif (n == 0)\nreturn null;\nTreeNode root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\nif (n == 0)\nreturn nullptr;\nTreeNode *root = new TreeNode(0);\nroot->left = buildTree(n - 1);\nroot->right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n\"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\nif n == 0:\nreturn None\nroot = TreeNode(0)\nroot.left = build_tree(n - 1)\nroot.right = build_tree(n - 1)\nreturn root\n
space_complexity.go
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *treeNode {\nif n == 0 {\nreturn nil\n}\nroot := newTreeNode(0)\nroot.left = buildTree(n - 1)\nroot.right = buildTree(n - 1)\nreturn root\n}\n
space_complexity.js
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\nif (n === 0) return null;\nconst root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.ts
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\nif (n === 0) return null;\nconst root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.c
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\nif (n == 0)\nreturn NULL;\nTreeNode *root = newTreeNode(0);\nroot->left = buildTree(n - 1);\nroot->right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.cs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n)\n{\nif (n == 0) return null;\nTreeNode root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.swift
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\nif n == 0 {\nreturn nil\n}\nlet root = TreeNode(x: 0)\nroot.left = buildTree(n: n - 1)\nroot.right = buildTree(n: n - 1)\nreturn root\n}\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) {\nif (n == 0) return null;\nconst root = try mem_allocator.create(inc.TreeNode(i32));\nroot.init(0);\nroot.left = try buildTree(mem_allocator, n - 1);\nroot.right = try buildTree(mem_allocator, n - 1);\nreturn root;\n}\n

Fig. \u6ee1\u4e8c\u53c9\u6811\u4ea7\u751f\u7684\u6307\u6570\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#olog-n","title":"\u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

\u5bf9\u6570\u9636\u5e38\u89c1\u4e8e\u5206\u6cbb\u7b97\u6cd5\u548c\u6570\u636e\u7c7b\u578b\u8f6c\u6362\u7b49\u3002

\u4f8b\u5982\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u7b97\u6cd5\uff0c\u8f93\u5165\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u6bcf\u8f6e\u9012\u5f52\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\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\u201c\u6570\u5b57\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\u201d\uff0c\u8f93\u5165\u4efb\u610f\u6b63\u6574\u6570 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6570\u4e3a \\(\\log_{10} n\\) \uff0c\u5373\u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a \\(\\log_{10} n\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_{10} n) = O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/space_complexity/#234","title":"2.3.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\u662f\u975e\u5e38\u56f0\u96be\u7684\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\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\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\u662f\u975e\u5e38\u91cd\u8981\u7684\u3002

"},{"location":"chapter_computational_complexity/summary/","title":"2.4. \u00a0 \u5c0f\u7ed3","text":"

\u7b97\u6cd5\u6548\u7387\u8bc4\u4f30

  • \u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u8bc4\u4ef7\u7b97\u6cd5\u6027\u80fd\u7684\u4e24\u4e2a\u5173\u952e\u7ef4\u5ea6\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\u514b\u670d\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\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\u5373\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u5f53 \\(n\\) \u8d8b\u5411\u6b63\u65e0\u7a77\u65f6\uff0c\\(T(n)\\) \u7684\u589e\u957f\u7ea7\u522b\u3002
  • \u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u4e24\u6b65\uff0c\u9996\u5148\u7edf\u8ba1\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002
  • \u5e38\u89c1\u65f6\u95f4\u590d\u6742\u5ea6\u4ece\u5c0f\u5230\u5927\u6392\u5217\u6709 \\(O(1)\\) , \\(O(\\log n)\\) , \\(O(n)\\) , \\(O(n \\log n)\\) , \\(O(n^2)\\) , \\(O(2^n)\\) , \\(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

  • \u7c7b\u4f3c\u4e8e\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\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\u8ba1\u5165\u7a7a\u95f4\u590d\u6742\u5ea6\u8ba1\u7b97\u3002\u6682\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u6307\u4ee4\u7a7a\u95f4\u3001\u6570\u636e\u7a7a\u95f4\u3001\u6808\u5e27\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\u95f4\u70b9\u4e0b\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u5e38\u89c1\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece\u5c0f\u5230\u5927\u6392\u5217\u6709 \\(O(1)\\) , \\(O(\\log n)\\) , \\(O(n)\\) , \\(O(n^2)\\) , \\(O(2^n)\\) \u7b49\u3002
"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.2. \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6","text":""},{"location":"chapter_computational_complexity/time_complexity/#221","title":"2.2.1. \u00a0 \u7edf\u8ba1\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4","text":"

\u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u76f4\u89c2\u4e14\u51c6\u786e\u5730\u53cd\u6620\u7b97\u6cd5\u7684\u6548\u7387\u3002\u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\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\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\u4ee5\u4e0b\u4ee3\u7801\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u6839\u636e\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u4e3a \\(6n + 12\\) ns \u3002

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\] JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nSystem.out.println(0);     // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\ncout << 0 << endl;         // 5 ns\n}\n}\n
# \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n: int) -> None:\na = 2      # 1 ns\na = a + 1  # 1 ns\na = a * 2  # 10 ns\n# \u5faa\u73af n \u6b21\nfor _ in range(n):  # 1 ns\nprint(0)        # 5 ns\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n int) {\na := 2      // 1 ns\na = a + 1   // 1 ns\na = a * 2   // 10 ns\n// \u5faa\u73af n \u6b21\nfor i := 0; i < n; i++ {    // 1 ns\nfmt.Println(a)          // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n) {\nvar a = 2; // 1 ns\na = a + 1; // 1 ns\na = a * 2; // 10 ns\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nconsole.log(0); // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n: number): void {\nvar a: number = 2; // 1 ns\na = a + 1; // 1 ns\na = a * 2; // 10 ns\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nconsole.log(0); // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nprintf(\"%d\", 0);            // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n)\n{\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++)\n{  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nConsole.WriteLine(0);     // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n: Int) {\nvar a = 2 // 1 ns\na = a + 1 // 1 ns\na = a * 2 // 10 ns\n// \u5faa\u73af n \u6b21\nfor _ in 0 ..< n { // 1 ns\nprint(0) // 5 ns\n}\n}\n
\n

\u7136\u800c\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\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/#222","title":"2.2.2. \u00a0 \u7edf\u8ba1\u65f6\u95f4\u589e\u957f\u8d8b\u52bf","text":"

\u300c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u300d\u91c7\u53d6\u4e86\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u5176\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\u8f83\u4e3a\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 , B , C \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\u300c\u5e38\u6570\u9636\u300d\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\u300c\u7ebf\u6027\u9636\u300d\u3002
  • \u7b97\u6cd5 C \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(1000000\\) \u6b21\uff0c\u4f46\u8fd0\u884c\u65f6\u95f4\u4ecd\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\u300c\u5e38\u6570\u9636\u300d\u3002
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\nSystem.out.println(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\nfor (int i = 0; i < n; i++) {\nSystem.out.println(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\nfor (int i = 0; i < 1000000; i++) {\nSystem.out.println(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\ncout << 0 << endl;\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\nfor (int i = 0; i < n; i++) {\ncout << 0 << endl;\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\nfor (int i = 0; i < 1000000; i++) {\ncout << 0 << endl;\n}\n}\n
# \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n: int) -> None:\nprint(0)\n# \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n: int) -> None:\nfor _ in range(n):\nprint(0)\n# \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n: int) -> None:\nfor _ in range(1000000):\nprint(0)\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_A(n int) {\nfmt.Println(0)\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithm_B(n int) {\nfor i := 0; i < n; i++ {\nfmt.Println(0)\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_C(n int) {\nfor i := 0; i < 1000000; i++ {\nfmt.Println(0)\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n) {\nconsole.log(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n) {\nfor (let i = 0; i < n; i++) {\nconsole.log(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n) {\nfor (let i = 0; i < 1000000; i++) {\nconsole.log(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n: number): void {\nconsole.log(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n: number): void {\nfor (let i = 0; i < n; i++) {\nconsole.log(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n: number): void {\nfor (let i = 0; i < 1000000; i++) {\nconsole.log(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\nprintf(\"%d\", 0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\nfor (int i = 0; i < n; i++) {\nprintf(\"%d\", 0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\nfor (int i = 0; i < 1000000; i++) {\nprintf(\"%d\", 0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n)\n{\nConsole.WriteLine(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n)\n{\nfor (int i = 0; i < n; i++)\n{\nConsole.WriteLine(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n)\n{\nfor (int i = 0; i < 1000000; i++)\n{\nConsole.WriteLine(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmA(n: Int) {\nprint(0)\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithmB(n: Int) {\nfor _ in 0 ..< n {\nprint(0)\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmC(n: Int) {\nfor _ in 0 ..< 1000000 {\nprint(0)\n}\n}\n
\n

Fig. \u7b97\u6cd5 A, B, C \u7684\u65f6\u95f4\u589e\u957f\u8d8b\u52bf

\u76f8\u8f83\u4e8e\u76f4\u63a5\u7edf\u8ba1\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u4f18\u52bf\u548c\u5c40\u9650\u6027\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 \u6162\uff0c\u5728 \\(n > 1000000\\) \u65f6\u6bd4\u7b97\u6cd5 C \u6162\u3002\u4e8b\u5b9e\u4e0a\uff0c\u53ea\u8981\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8db3\u591f\u5927\uff0c\u590d\u6742\u5ea6\u4e3a\u300c\u5e38\u6570\u9636\u300d\u7684\u7b97\u6cd5\u4e00\u5b9a\u4f18\u4e8e\u300c\u7ebf\u6027\u9636\u300d\u7684\u7b97\u6cd5\uff0c\u8fd9\u6b63\u662f\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u6240\u8868\u8fbe\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\u7684\u8fd0\u884c\u65f6\u95f4\u7684\u7edf\u8ba1\u201d\u7b80\u5316\u4e3a\u201c\u8ba1\u7b97\u64cd\u4f5c\u7684\u6570\u91cf\u7684\u7edf\u8ba1\u201d\uff0c\u8fd9\u6837\u7684\u7b80\u5316\u65b9\u6cd5\u5927\u5927\u964d\u4f4e\u4e86\u4f30\u7b97\u96be\u5ea6\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\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/#223","title":"2.2.3. \u00a0 \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c","text":"

\u8bbe\u7b97\u6cd5\u7684\u8ba1\u7b97\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\u4e0b\u7b97\u6cd5\u7684\u64cd\u4f5c\u6570\u91cf\u4e3a

\\[ T(n) = 3 + 2n \\] JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
void algorithm(int n) {\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nSystem.out.println(0);    // +1\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\ncout << 0 << endl;    // +1\n}\n}\n
def algorithm(n: int) -> None:\na: int = 1  # +1\na = a + 1  # +1\na = a * 2  # +1\n# \u5faa\u73af n \u6b21\nfor i in range(n):  # +1\nprint(0)        # +1\n
func algorithm(n int) {\na := 1      // +1\na = a + 1   // +1\na = a * 2   // +1\n// \u5faa\u73af n \u6b21\nfor i := 0; i < n; i++ {   // +1\nfmt.Println(a)         // +1\n}\n}\n
function algorithm(n) {\nvar a = 1; // +1\na += 1; // +1\na *= 2; // +1\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nconsole.log(0); // +1\n}\n}\n
function algorithm(n: number): void{\nvar a: number = 1; // +1\na += 1; // +1\na *= 2; // +1\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nconsole.log(0); // +1\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nprintf(\"%d\", 0);            // +1\n}\n}  
void algorithm(int n)\n{\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n{\nConsole.WriteLine(0);   // +1\n}\n}\n
func algorithm(n: Int) {\nvar a = 1 // +1\na = a + 1 // +1\na = a * 2 // +1\n// \u5faa\u73af n \u6b21\nfor _ in 0 ..< n { // +1\nprint(0) // +1\n}\n}\n
\n

\\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u6570\uff0c\u8bf4\u660e\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u662f\u7ebf\u6027\u7684\uff0c\u56e0\u6b64\u53ef\u4ee5\u5f97\u51fa\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\u300c\u5927 \\(O\\) \u8bb0\u53f7 Big-\\(O\\) Notation\u300d\uff0c\u8868\u793a\u51fd\u6570 \\(T(n)\\) \u7684\u300c\u6e10\u8fd1\u4e0a\u754c Asymptotic Upper Bound\u300d\u3002

\u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u672c\u8d28\u4e0a\u662f\u8ba1\u7b97\u201c\u64cd\u4f5c\u6570\u91cf\u51fd\u6570 \\(T(n)\\)\u201d\u7684\u6e10\u8fd1\u4e0a\u754c\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u6765\u770b\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\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) $$ \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)) $$

Fig. \u51fd\u6570\u7684\u6e10\u8fd1\u4e0a\u754c

\u4ece\u672c\u8d28\u4e0a\u8bb2\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

"},{"location":"chapter_computational_complexity/time_complexity/#224","title":"2.2.4. \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\u9700\u62c5\u5fc3\u3002\u56e0\u4e3a\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u6570\u5b66\u610f\u4e49\u53ef\u4ee5\u9010\u6e10\u9886\u609f\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) \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\u88ab\u5ffd\u7565\u3002\u6839\u636e\u6b64\u539f\u5219\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u8ba1\u6570\u7b80\u5316\u6280\u5de7\uff1a

  1. \u5ffd\u7565\u4e0e \\(n\\) \u65e0\u5173\u7684\u64cd\u4f5c\u3002\u56e0\u4e3a\u5b83\u4eec\u90fd\u662f \\(T(n)\\) \u4e2d\u7684\u5e38\u6570\u9879\uff0c\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\u4e0a\u8ff0 1. \u548c 2. \u6280\u5de7\u3002

\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u3001\u540e\u7684\u7edf\u8ba1\u7ed3\u679c\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} \\]

\u6700\u7ec8\uff0c\u4e24\u8005\u90fd\u80fd\u63a8\u51fa\u76f8\u540c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7ed3\u679c\uff0c\u5373 \\(O(n^2)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
void algorithm(int n) {\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++) {\nSystem.out.println(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++) {\nfor (int j = 0; j < n + 1; j++) {\nSystem.out.println(0);\n}\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++) {\ncout << 0 << endl;\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++) {\nfor (int j = 0; j < n + 1; j++) {\ncout << 0 << endl;\n}\n}\n}\n
def algorithm(n: int) -> None:\na: int = 1  # +0\uff08\u6280\u5de7 1\uff09\na = a + n   # +0\uff08\u6280\u5de7 1\uff09\n# +n\uff08\u6280\u5de7 2\uff09\nfor i in range(5 * n + 1):\nprint(0)\n# +n*n\uff08\u6280\u5de7 3\uff09\nfor i in range(2 * n):\nfor j in range(n + 1):\nprint(0)\n
func algorithm(n int) {\na := 1      // +0\uff08\u6280\u5de7 1\uff09\na = a + n  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor i := 0; i < 5 * n + 1; i++ {\nfmt.Println(0)\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor i := 0; i < 2 * n; i++ {\nfor j := 0; j < n + 1; j++ {\nfmt.Println(0)\n}\n}\n}\n
function algorithm(n) {\nlet a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (let i = 0; i < 5 * n + 1; i++) {\nconsole.log(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (let i = 0; i < 2 * n; i++) {\nfor (let j = 0; j < n + 1; j++) {\nconsole.log(0);\n}\n}\n}\n
function algorithm(n: number): void {\nlet a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (let i = 0; i < 5 * n + 1; i++) {\nconsole.log(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (let i = 0; i < 2 * n; i++) {\nfor (let j = 0; j < n + 1; j++) {\nconsole.log(0);\n}\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++) {\nprintf(\"%d\", 0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++) {\nfor (int j = 0; j < n + 1; j++) {\nprintf(\"%d\", 0);\n}\n}\n}\n
void algorithm(int n)\n{\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++)\n{\nConsole.WriteLine(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++)\n{\nfor (int j = 0; j < n + 1; j++)\n{\nConsole.WriteLine(0);\n}\n}\n}\n
func algorithm(n: Int) {\nvar a = 1 // +0\uff08\u6280\u5de7 1\uff09\na = a + n // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor _ in 0 ..< (5 * n + 1) {\nprint(0)\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor _ in 0 ..< (2 * n) {\nfor _ in 0 ..< (n + 1) {\nprint(0)\n}\n}\n}\n
\n
"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2) \u5224\u65ad\u6e10\u8fd1\u4e0a\u754c","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\u7531\u591a\u9879\u5f0f \\(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\u88ab\u5ffd\u7565\u3002

\u4ee5\u4e0b\u8868\u683c\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

\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/#225","title":"2.2.5. \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\u5305\u62ec\uff08\u6309\u7167\u4ece\u4f4e\u5230\u9ad8\u7684\u987a\u5e8f\u6392\u5217\uff09\uff1a

\\[ \\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} \\]

Fig. \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u89c1\u7c7b\u578b

Tip

\u90e8\u5206\u793a\u4f8b\u4ee3\u7801\u9700\u8981\u4e00\u4e9b\u9884\u5907\u77e5\u8bc6\uff0c\u5305\u62ec\u6570\u7ec4\u3001\u9012\u5f52\u7b97\u6cd5\u7b49\u3002\u5982\u679c\u9047\u5230\u4e0d\u7406\u89e3\u7684\u90e8\u5206\uff0c\u8bf7\u4e0d\u8981\u62c5\u5fc3\uff0c\u53ef\u4ee5\u5728\u5b66\u4e60\u5b8c\u540e\u9762\u7ae0\u8282\u540e\u518d\u56de\u987e\u3002\u73b0\u9636\u6bb5\uff0c\u8bf7\u5148\u4e13\u6ce8\u4e8e\u7406\u89e3\u65f6\u95f4\u590d\u6742\u5ea6\u7684\u542b\u4e49\u548c\u63a8\u7b97\u65b9\u6cd5\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#o1","title":"\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

\u5bf9\u4e8e\u4ee5\u4e0b\u7b97\u6cd5\uff0c\u5c3d\u7ba1\u64cd\u4f5c\u6570\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u4e8e\u5176\u4e0e\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5e38\u6570\u9636 */\nint constant(int n) {\nint count = 0;\nint size = 100000;\nfor (int i = 0; i < size; i++)\ncount++;\nreturn count;\n}\n
time_complexity.cpp
/* \u5e38\u6570\u9636 */\nint constant(int n) {\nint count = 0;\nint size = 100000;\nfor (int i = 0; i < size; i++)\ncount++;\nreturn count;\n}\n
time_complexity.py
def constant(n: int) -> int:\n\"\"\"\u5e38\u6570\u9636\"\"\"\ncount: int = 0\nsize: int = 100000\nfor _ in range(size):\ncount += 1\nreturn count\n
time_complexity.go
/* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\ncount := 0\nsize := 100000\nfor i := 0; i < size; i++ {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\nlet count = 0;\nconst size = 100000;\nfor (let i = 0; i < size; i++) count++;\nreturn count;\n}\n
time_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\nlet count = 0;\nconst size = 100000;\nfor (let i = 0; i < size; i++) count++;\nreturn count;\n}\n
time_complexity.c
/* \u5e38\u6570\u9636 */\nint constant(int n) {\nint count = 0;\nint size = 100000;\nint i = 0;\nfor (int i = 0; i < size; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5e38\u6570\u9636 */\nint constant(int n)\n{\nint count = 0;\nint size = 100000;\nfor (int i = 0; i < size; i++)\ncount++;\nreturn count;\n}\n
time_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\nvar count = 0\nlet size = 100_000\nfor _ in 0 ..< size {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n_ = n;\nvar count: i32 = 0;\nconst size: i32 = 100_000;\nvar i: i32 = 0;\nwhile(i<size) : (i += 1) {\ncount += 1;\n}\nreturn count;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#on","title":"\u7ebf\u6027\u9636 \\(O(n)\\)","text":"

\u7ebf\u6027\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4ee5\u7ebf\u6027\u7ea7\u522b\u589e\u957f\u3002\u7ebf\u6027\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5355\u5c42\u5faa\u73af\u4e2d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\nint count = 0;\nfor (int i = 0; i < n; i++)\ncount++;\nreturn count;\n}\n
time_complexity.cpp
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\nint count = 0;\nfor (int i = 0; i < n; i++)\ncount++;\nreturn count;\n}\n
time_complexity.py
def linear(n: int) -> int:\n\"\"\"\u7ebf\u6027\u9636\"\"\"\ncount: int = 0\nfor _ in range(n):\ncount += 1\nreturn count\n
time_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\ncount := 0\nfor i := 0; i < n; i++ {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\nlet count = 0;\nfor (let i = 0; i < n; i++) count++;\nreturn count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\nlet count = 0;\nfor (let i = 0; i < n; i++) count++;\nreturn count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\nint count = 0;\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636 */\nint linear(int n)\n{\nint count = 0;\nfor (int i = 0; i < n; i++)\ncount++;\nreturn count;\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\nvar count = 0\nfor _ in 0 ..< n {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < n) : (i += 1) {\ncount += 1;\n}\nreturn count;\n}\n

\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\u3002

\u5982\u4f55\u786e\u5b9a\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \uff1f

\u6570\u636e\u5927\u5c0f \\(n\\) \u9700\u6839\u636e\u8f93\u5165\u6570\u636e\u7684\u7c7b\u578b\u6765\u5177\u4f53\u786e\u5b9a\u3002\u4f8b\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u76f4\u63a5\u5c06 \\(n\\) \u89c6\u4e3a\u8f93\u5165\u6570\u636e\u5927\u5c0f\uff1b\u5728\u4e0b\u9762\u904d\u5386\u6570\u7ec4\u7684\u793a\u4f8b\u4e2d\uff0c\u6570\u636e\u5927\u5c0f \\(n\\) \u4e3a\u6570\u7ec4\u7684\u957f\u5ea6\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (int num : nums) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (int num : nums) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.py
def array_traversal(nums: list[int]) -> int:\n\"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\ncount: int = 0\n# \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor num in nums:\ncount += 1\nreturn count\n
time_complexity.go
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\ncount := 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor range nums {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums)\n{\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nforeach (int num in nums)\n{\ncount++;\n}\nreturn count;\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\nvar count = 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor _ in nums {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\nvar count: i32 = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (nums) |_| {\ncount += 1;\n}\nreturn count;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#on2","title":"\u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

\u5e73\u65b9\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f\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\u90fd\u4e3a \\(O(n)\\) \uff0c\u56e0\u6b64\u603b\u4f53\u4e3a \\(O(n^2)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.py
def quadratic(n: int) -> int:\n\"\"\"\u5e73\u65b9\u9636\"\"\"\ncount: int = 0\n# \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor i in range(n):\nfor j in range(n):\ncount += 1\nreturn count\n
time_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\ncount := 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor i := 0; i < n; i++ {\nfor j := 0; j < n; j++ {\ncount++\n}\n}\nreturn count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636 */\nint quadratic(int n)\n{\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++)\n{\nfor (int j = 0; j < n; j++)\n{\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\nvar count = 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor _ in 0 ..< n {\nfor _ in 0 ..< n {\ncount += 1\n}\n}\nreturn count\n}\n
time_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\nvar count: i32 = 0;\nvar i: i32 = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nwhile (i < n) : (i += 1) {\nvar j: i32 = 0;\nwhile (j < n) : (j += 1) {\ncount += 1;\n}\n}\nreturn count;\n}\n

Fig. \u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u3001\u5e73\u65b9\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4ee5\u300c\u5192\u6ce1\u6392\u5e8f\u300d\u4e3a\u4f8b\uff0c\u5916\u5c42\u5faa\u73af\u6267\u884c \\(n - 1\\) \u6b21\uff0c\u5185\u5c42\u5faa\u73af\u6267\u884c \\(n-1, n-2, \\cdots, 2, 1\\) \u6b21\uff0c\u5e73\u5747\u4e3a \\(\\frac{n}{2}\\) \u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

\\[ O((n - 1) \\frac{n}{2}) = O(n^2) \\] JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\nint count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\nint count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n\"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\ncount: int = 0  # \u8ba1\u6570\u5668\n# \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in range(len(nums) - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in range(i):\nif nums[j] > nums[j + 1]:\n# \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\ntmp: int = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\ncount += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\nreturn count\n
time_complexity.go
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\ncount := 0 // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j := 0; j < i; j++ {\nif nums[j] > nums[j+1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\ntmp := nums[j]\nnums[j] = nums[j+1]\nnums[j+1] = tmp\ncount += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\nlet count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\nlet count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\nint count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = n - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums)\n{\nint count = 0;  // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.Length - 1; i > 0; i--)\n{\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++)\n{\nif (nums[j] > nums[j + 1])\n{\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\nvar count = 0 // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in 0 ..< i {\nif nums[j] > nums[j + 1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\ncount += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count\n}\n
time_complexity.zig
// \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\nvar count: i32 = 0;  // \u8ba1\u6570\u5668 \n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nvar i: i32 = @intCast(i32, nums.len ) - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nwhile (j < i) : (j += 1) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nvar tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#o2n","title":"\u6307\u6570\u9636 \\(O(2^n)\\)","text":"

Note

\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

\u6307\u6570\u9636\u589e\u957f\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u901a\u5e38\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002\u82e5\u4e00\u4e2a\u95ee\u9898\u4f7f\u7528\u300c\u66b4\u529b\u679a\u4e3e\u300d\u6c42\u89e3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u4f7f\u7528\u300c\u52a8\u6001\u89c4\u5212\u300d\u6216\u300c\u8d2a\u5fc3\u7b97\u6cd5\u300d\u7b49\u65b9\u6cd5\u6765\u89e3\u51b3\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\nint count = 0, base = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\nint count = 0, base = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.py
def exponential(n: int) -> int:\n\"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\ncount: int = 0\nbase: int = 1\n# cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor _ in range(n):\nfor _ in range(base):\ncount += 1\nbase *= 2\n# count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\ncount, base := 0, 1\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor i := 0; i < n; i++ {\nfor j := 0; j < base; j++ {\ncount++\n}\nbase *= 2\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\nlet count = 0,\nbase = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\nlet count = 0,\nbase = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\nint count = 0;\nint bas = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < bas; j++) {\ncount++;\n}\nbas *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n)\n{\nint count = 0, bas = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++)\n{\nfor (int j = 0; j < bas; j++)\n{\ncount++;\n}\nbas *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\nvar count = 0\nvar base = 1\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor _ in 0 ..< n {\nfor _ in 0 ..< base {\ncount += 1\n}\nbase *= 2\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count\n}\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\nvar count: i32 = 0;\nvar bas: i32 = 1;\nvar i: i32 = 0;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nwhile (i < n) : (i += 1) {\nvar j: i32 = 0;\nwhile (j < bas) : (j += 1) {\ncount += 1;\n}\nbas *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n

Fig. \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\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\uff0c\u4e0d\u65ad\u5730\u4e00\u5206\u4e3a\u4e8c\uff0c\u7ecf\u8fc7 \\(n\\) \u6b21\u5206\u88c2\u540e\u505c\u6b62\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\nif (n == 1)\nreturn 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\nif (n == 1)\nreturn 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.py
def exp_recur(n: int) -> int:\n\"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n == 1:\nreturn 1\nreturn exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\nif n == 1 {\nreturn 1\n}\nreturn expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\nif (n == 1) return 1;\nreturn 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 {\nif (n == 1) return 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\nif (n == 1)\nreturn 1;\nreturn 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{\nif (n == 1) return 1;\nreturn 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 {\nif n == 1 {\nreturn 1\n}\nreturn expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\nif (n == 1) return 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#olog-n","title":"\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\u7684\u60c5\u51b5\u201d\u3002\u5bf9\u6570\u9636\u4ec5\u6b21\u4e8e\u5e38\u6570\u9636\uff0c\u65f6\u95f4\u589e\u957f\u7f13\u6162\uff0c\u662f\u7406\u60f3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u300c\u4e8c\u5206\u67e5\u627e\u300d\u548c\u300c\u5206\u6cbb\u7b97\u6cd5\u300d\u4e2d\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u591a\u201d\u548c\u201c\u5316\u7e41\u4e3a\u7b80\u201d\u7684\u7b97\u6cd5\u601d\u60f3\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n) {\nint count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n) {\nint count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.py
def logarithmic(n: float) -> int:\n\"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\ncount: int = 0\nwhile n > 1:\nn = n / 2\ncount += 1\nreturn count\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n float64) int {\ncount := 0\nfor n > 1 {\nn = n / 2\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\nlet count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\nlet count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n) {\nint count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n)\n{\nint count = 0;\nwhile (n > 1)\n{\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Double) -> Int {\nvar count = 0\nvar n = n\nwhile n > 1 {\nn = n / 2\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: f32) i32 {\nvar count: i32 = 0;\nvar n_var = n;\nwhile (n_var > 1)\n{\nn_var = n_var / 2;\ncount +=1;\n}\nreturn count;\n}\n

Fig. \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\u3002\u4ee5\u4e0b\u4ee3\u7801\u5f62\u6210\u4e86\u4e00\u4e2a\u9ad8\u5ea6\u4e3a \\(\\log_2 n\\) \u7684\u9012\u5f52\u6811\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n) {\nif (n <= 1)\nreturn 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n) {\nif (n <= 1)\nreturn 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.py
def log_recur(n: float) -> int:\n\"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n <= 1:\nreturn 0\nreturn log_recur(n / 2) + 1\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n float64) int {\nif n <= 1 {\nreturn 0\n}\nreturn logRecur(n/2) + 1\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n) {\nif (n <= 1)\nreturn 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n)\n{\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Double) -> Int {\nif n <= 1 {\nreturn 0\n}\nreturn logRecur(n: n / 2) + 1\n}\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: f32) i32 {\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#on-log-n","title":"\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

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n) {\nif (n <= 1)\nreturn 1;\nint count = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n) {\nif (n <= 1)\nreturn 1;\nint count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.py
def linear_log_recur(n: float) -> int:\n\"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\nif n <= 1:\nreturn 1\ncount: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\nfor _ in range(n):\ncount += 1\nreturn count\n
time_complexity.go
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n float64) int {\nif n <= 1 {\nreturn 1\n}\ncount := linearLogRecur(n/2) +\nlinearLogRecur(n/2)\nfor i := 0.0; i < n; i++ {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\nif (n <= 1) return 1;\nlet count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (let i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\nif (n <= 1) return 1;\nlet count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (let i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n) {\nif (n <= 1)\nreturn 1;\nint count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n)\n{\nif (n <= 1) return 1;\nint count = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nfor (int i = 0; i < n; i++)\n{\ncount++;\n}\nreturn count;\n}\n
time_complexity.swift
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Double) -> Int {\nif n <= 1 {\nreturn 1\n}\nvar count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\nfor _ in stride(from: 0, to: n, by: 1) {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: f32) i32 {\nif (n <= 1) return 1;\nvar count: i32 = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nvar i: f32 = 0;\nwhile (i < n) : (i += 1) {\ncount += 1;\n}\nreturn count;\n}\n

Fig. \u7ebf\u6027\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/time_complexity/#on_1","title":"\u9636\u4e58\u9636 \\(O(n!)\\)","text":"

\u9636\u4e58\u9636\u5bf9\u5e94\u6570\u5b66\u4e0a\u7684\u300c\u5168\u6392\u5217\u300d\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 \\cdots \\times 2 \\times 1 \\]

\u9636\u4e58\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u5b9e\u73b0\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\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\u7ec8\u6b62\u5206\u88c2\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\nif (n == 0)\nreturn 1;\nint count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (int i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\nif (n == 0)\nreturn 1;\nint count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (int i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.py
def factorial_recur(n: int) -> int:\n\"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n == 0:\nreturn 1\ncount: int = 0\n# \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor _ in range(n):\ncount += factorial_recur(n - 1)\nreturn count\n
time_complexity.go
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\nif n == 0 {\nreturn 1\n}\ncount := 0\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor i := 0; i < n; i++ {\ncount += factorialRecur(n - 1)\n}\nreturn count\n}\n
time_complexity.js
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\nif (n == 0) return 1;\nlet count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (let i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.ts
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\nif (n == 0) return 1;\nlet count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (let i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.c
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\nif (n == 0)\nreturn 1;\nint count = 0;\nfor (int i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.cs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n)\n{\nif (n == 0) return 1;\nint count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (int i = 0; i < n; i++)\n{\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.swift
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\nif n == 0 {\nreturn 1\n}\nvar count = 0\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor _ in 0 ..< n {\ncount += factorialRecur(n: n - 1)\n}\nreturn count\n}\n
time_complexity.zig
// \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\nif (n == 0) return 1;\nvar count: i32 = 0;\nvar i: i32 = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nwhile (i < n) : (i += 1) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n

Fig. \u9636\u4e58\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/time_complexity/#226","title":"2.2.6. \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6","text":"

\u67d0\u4e9b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u4f8b\u5982\uff0c\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\u4f46\u5143\u7d20\u987a\u5e8f\u662f\u968f\u673a\u6253\u4e71\u7684\uff1b\u7b97\u6cd5\u7684\u4efb\u52a1\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\uff1a

  • \u5f53 nums = [?, ?, ..., 1] \uff0c\u5373\u5f53\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u65f6\uff0c\u9700\u8981\u5b8c\u6574\u904d\u5386\u6570\u7ec4\uff0c\u6b64\u65f6\u8fbe\u5230 \u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\)\uff1b
  • \u5f53 nums = [1, ?, ?, ...] \uff0c\u5373\u5f53\u9996\u4e2a\u6570\u5b57\u4e3a \\(1\\) \u65f6\uff0c\u65e0\u8bba\u6570\u7ec4\u591a\u957f\u90fd\u4e0d\u9700\u8981\u7ee7\u7eed\u904d\u5386\uff0c\u6b64\u65f6\u8fbe\u5230 \u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(\\Omega(1)\\)\uff1b

\u201c\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\u201d\u4f7f\u7528\u5927 \\(O\\) \u8bb0\u53f7\u8868\u793a\uff0c\u4ee3\u8868\u300c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u300d\u3002\u76f8\u5e94\u5730\uff0c\u201c\u51fd\u6570\u6e10\u8fd1\u4e0b\u754c\u201d\u7528 \\(\\Omega\\) \u8bb0\u53f7\u6765\u8868\u793a\uff0c\u4ee3\u8868\u300c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u300d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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) {\nInteger[] nums = new Integer[n];\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nCollections.shuffle(Arrays.asList(nums));\n// Integer[] -> int[]\nint[] res = new int[n];\nfor (int i = 0; i < n; i++) {\nres[i] = nums[i];\n}\nreturn res;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\nfor (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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -1;\n}\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) {\nvector<int> nums(n);\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\nunsigned seed = chrono::system_clock::now().time_since_epoch().count();\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nshuffle(nums.begin(), nums.end(), default_random_engine(seed));\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\nfor (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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -1;\n}\n
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\nnums: list[int] = [i for i in range(1, n + 1)]\n# \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nrandom.shuffle(nums)\nreturn nums\ndef find_one(nums: list[int]) -> int:\n\"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\nfor 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)\nif nums[i] == 1:\nreturn i\nreturn -1\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 {\nnums := make([]int, n)\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor i := 0; i < n; i++ {\nnums[i] = i + 1\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nrand.Shuffle(len(nums), func(i, j int) {\nnums[i], nums[j] = nums[j], nums[i]\n})\nreturn nums\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\nfor 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)\nif nums[i] == 1 {\nreturn i\n}\n}\nreturn -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) {\nconst nums = Array(n);\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (let i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (let i = 0; i < n; i++) {\nconst r = Math.floor(Math.random() * (i + 1));\nconst temp = nums[i];\nnums[i] = nums[r];\nnums[r] = temp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\nfor (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)\nif (nums[i] === 1) {\nreturn i;\n}\n}\nreturn -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[] {\nconst nums = Array(n);\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (let i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (let i = 0; i < n; i++) {\nconst r = Math.floor(Math.random() * (i + 1));\nconst temp = nums[i];\nnums[i] = nums[r];\nnums[r] = temp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\nfor (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)\nif (nums[i] === 1) {\nreturn i;\n}\n}\nreturn -1;\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\u4e3an\uff0c\u5143\u7d20\u7c7b\u578b\u4e3aint\uff09\nint *nums = (int *)malloc(n * sizeof(int));\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (int i = n - 1; i > 0; i--) {\nint j = rand() % (i + 1);\nint temp = nums[i];\nnums[i] = nums[j];\nnums[j] = temp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\nfor (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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -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{\nint[] nums = new int[n];\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++)\n{\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (int i = 0; i < nums.Length; i++)\n{\nvar index = new Random().Next(i, nums.Length);\nvar tmp = nums[i];\nvar ran = nums[index];\nnums[i] = ran;\nnums[index] = tmp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums)\n{\nfor (int i = 0; i < nums.Length; i++)\n{\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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -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 }\nvar nums = Array(1 ... n)\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nnums.shuffle()\nreturn nums\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\nfor 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)\nif nums[i] == 1 {\nreturn i\n}\n}\nreturn -1\n}\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\npub fn randomNumbers(comptime n: usize) [n]i32 {\nvar nums: [n]i32 = undefined;\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (nums) |*num, i| {\nnum.* = @intCast(i32, i) + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nconst rand = std.crypto.random;\nrand.shuffle(i32, &nums);\nreturn nums;\n}\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\npub fn findOne(nums: []i32) i32 {\nfor (nums) |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)\nif (num == 1) return @intCast(i32, i);\n}\nreturn -1;\n}\n

Tip

\u5b9e\u9645\u5e94\u7528\u4e2d\u6211\u4eec\u5f88\u5c11\u4f7f\u7528\u300c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u300d\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\u76f8\u53cd\uff0c\u300c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u300d\u66f4\u4e3a\u5b9e\u7528\uff0c\u56e0\u4e3a\u5b83\u7ed9\u51fa\u4e86\u4e00\u4e2a\u201c\u6548\u7387\u5b89\u5168\u503c\u201d\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\u6216\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ea\u51fa\u73b0\u5728\u201c\u7279\u6b8a\u5206\u5e03\u7684\u6570\u636e\u201d\u4e2d\uff0c\u8fd9\u4e9b\u60c5\u51b5\u7684\u51fa\u73b0\u6982\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u56e0\u6b64\u5e76\u4e0d\u80fd\u6700\u771f\u5b9e\u5730\u53cd\u6620\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u3002\u76f8\u8f83\u4e4b\u4e0b\uff0c\u300c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u300d\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\u5219\u662f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a \\(\\frac{n}{2}\\) \uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(\\Theta(\\frac{n}{2}) = \\Theta(n)\\) \u3002

\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u5c24\u5176\u662f\u8f83\u4e3a\u590d\u6742\u7684\u7b97\u6cd5\uff0c\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u6bd4\u8f83\u56f0\u96be\uff0c\u56e0\u4e3a\u5f88\u96be\u7b80\u4fbf\u5730\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\u6211\u4eec\u5e38\u5e38\u4f7f\u7528\u5b83\u6765\u8868\u793a\u300c\u5e73\u5747\u590d\u6742\u5ea6\u300d\uff0c\u4f46\u4ece\u4e25\u683c\u610f\u4e49\u4e0a\u770b\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/classification_of_data_structure/","title":"3.2. \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u4ece\u903b\u8f91\u7ed3\u6784\u548c\u7269\u7406\u7ed3\u6784\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/#321","title":"3.2.1. \u00a0 \u903b\u8f91\u7ed3\u6784\uff1a\u7ebf\u6027\u4e0e\u975e\u7ebf\u6027","text":"

\u300c\u903b\u8f91\u7ed3\u6784\u300d\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\u987a\u5e8f\u4f9d\u6b21\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\u7956\u5148\u4e0e\u540e\u4ee3\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

\u903b\u8f91\u7ed3\u6784\u901a\u5e38\u5206\u4e3a\u300c\u7ebf\u6027\u300d\u548c\u300c\u975e\u7ebf\u6027\u300d\u4e24\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\uff0c\u4f8b\u5982\u7f51\u72b6\u6216\u6811\u72b6\u7ed3\u6784\u3002

  • \u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\uff1b
  • \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6811\u3001\u56fe\u3001\u5806\u3001\u54c8\u5e0c\u8868\uff1b

Fig. \u7ebf\u6027\u4e0e\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784

"},{"location":"chapter_data_structure/classification_of_data_structure/#322","title":"3.2.2. \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u79bb\u6563","text":"

Note

\u5982\u82e5\u9605\u8bfb\u8d77\u6765\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u4e0b\u4e00\u7ae0\u201c\u6570\u7ec4\u4e0e\u94fe\u8868\u201d\uff0c\u7136\u540e\u518d\u56de\u5934\u7406\u89e3\u7269\u7406\u7ed3\u6784\u7684\u542b\u4e49\u3002

\u300c\u7269\u7406\u7ed3\u6784\u300d\u4f53\u73b0\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\u4ee5\u5206\u4e3a\u6570\u7ec4\u7684\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u94fe\u8868\u7684\u79bb\u6563\u7a7a\u95f4\u5b58\u50a8\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\u540c\u65f6\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u65b9\u9762\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u70b9\u3002

Fig. \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u4e0e\u79bb\u6563\u7a7a\u95f4\u5b58\u50a8

\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\uff1b
  • \u57fa\u4e8e\u94fe\u8868\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\uff1b

\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u4e5f\u88ab\u79f0\u4e3a\u300c\u9759\u6001\u6570\u636e\u7ed3\u6784\u300d\uff0c\u8fd9\u610f\u5473\u7740\u6b64\u7c7b\u6570\u636e\u7ed3\u6784\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u76f8\u5bf9\u5e94\u5730\uff0c\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u88ab\u79f0\u4e3a\u300c\u52a8\u6001\u6570\u636e\u7ed3\u6784\u300d\uff0c\u8fd9\u7c7b\u6570\u636e\u7ed3\u6784\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\u3002

Tip

\u6570\u7ec4\u4e0e\u94fe\u8868\u662f\u5176\u4ed6\u6240\u6709\u6570\u636e\u7ed3\u6784\u7684\u201c\u5e95\u5c42\u79ef\u6728\u201d\uff0c\u5efa\u8bae\u8bfb\u8005\u6295\u5165\u66f4\u591a\u65f6\u95f4\u6df1\u5165\u4e86\u89e3\u8fd9\u4e24\u79cd\u57fa\u672c\u6570\u636e\u7ed3\u6784\u3002

"},{"location":"chapter_data_structure/data_and_memory/","title":"3.1. \u00a0 \u6570\u636e\u4e0e\u5185\u5b58","text":""},{"location":"chapter_data_structure/data_and_memory/#311","title":"3.1.1. \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b","text":"

\u8c08\u53ca\u8ba1\u7b97\u673a\u4e2d\u7684\u6570\u636e\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

\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u8fdb\u884c\u8fd0\u7b97\u7684\u7c7b\u578b\uff0c\u5728\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\u3002

  • \u300c\u6574\u6570\u300d\u6309\u7167\u4e0d\u540c\u7684\u957f\u5ea6\u5206\u4e3a byte, short, int, long \u3002\u5728\u6ee1\u8db3\u53d6\u503c\u8303\u56f4\u7684\u524d\u63d0\u4e0b\uff0c\u6211\u4eec\u5e94\u8be5\u5c3d\u91cf\u9009\u53d6\u8f83\u77ed\u7684\u6574\u6570\u7c7b\u578b\uff0c\u4ee5\u51cf\u5c0f\u5185\u5b58\u7a7a\u95f4\u5360\u7528\uff1b
  • \u300c\u6d6e\u70b9\u6570\u300d\u8868\u793a\u5c0f\u6570\uff0c\u6309\u957f\u5ea6\u5206\u4e3a float, double \uff0c\u9009\u7528\u89c4\u5219\u4e0e\u6574\u6570\u76f8\u540c\u3002
  • \u300c\u5b57\u7b26\u300d\u5728\u8ba1\u7b97\u673a\u4e2d\u4ee5\u5b57\u7b26\u96c6\u5f62\u5f0f\u4fdd\u5b58\uff0cchar \u7684\u503c\u5b9e\u9645\u4e0a\u662f\u6570\u5b57\uff0c\u4ee3\u8868\u5b57\u7b26\u96c6\u4e2d\u7684\u7f16\u53f7\uff0c\u8ba1\u7b97\u673a\u901a\u8fc7\u5b57\u7b26\u96c6\u67e5\u8868\u5b8c\u6210\u7f16\u53f7\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002
  • \u300c\u5e03\u5c14\u300d\u4ee3\u8868\u903b\u8f91\u4e2d\u7684\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\uff0c\u5176\u5360\u7528\u7a7a\u95f4\u9700\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u786e\u5b9a\u3002
\u7c7b\u522b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u53d6\u503c\u8303\u56f4 \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 byte \\(-2^7\\) ~ \\(2^7 - 1\\) ( \\(-128\\) ~ \\(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\\) \u6d6e\u70b9\u6570 float 4 bytes \\(-3.4 \\times 10^{38}\\) ~ \\(3.4 \\times 10^{38}\\) \\(0.0\\) f double 8 bytes \\(-1.7 \\times 10^{308}\\) ~ \\(1.7 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 bytes / 1 byte \\(0\\) ~ \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 byte / 1 bit \\(\\text{true}\\) \u6216 \\(\\text{false}\\) \\(\\text{false}\\)

\u4ee5\u4e0a\u8868\u683c\u4e2d\uff0c\u52a0\u7c97\u9879\u5728\u7b97\u6cd5\u9898\u4e2d\u6700\u4e3a\u5e38\u7528\u3002\u6b64\u8868\u683c\u65e0\u9700\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

"},{"location":"chapter_data_structure/data_and_memory/#_1","title":"\u6574\u6570\u8868\u793a\u65b9\u5f0f","text":"

\u6574\u6570\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u53d8\u91cf\u4f7f\u7528\u7684\u5185\u5b58\u957f\u5ea6\uff0c\u5373\u5b57\u8282\uff08\u6216\u6bd4\u7279\uff09\u6570\u3002\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c1 \u5b57\u8282 (byte) = 8 \u6bd4\u7279 (bit)\uff0c1 \u6bd4\u7279\u5373 1 \u4e2a\u4e8c\u8fdb\u5236\u4f4d\u3002\u4ee5 int \u7c7b\u578b\u4e3a\u4f8b\uff1a

  1. \u6574\u6570\u7c7b\u578b int \u5360\u7528 4 bytes = 32 bits \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u4e0d\u540c\u7684\u6570\u5b57\uff1b
  2. \u5c06\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\\(0\\) \u4ee3\u8868\u6b63\u6570\uff0c\\(1\\) \u4ee3\u8868\u8d1f\u6570\uff0c\u4e00\u5171\u53ef\u8868\u793a \\(2^{31}\\) \u4e2a\u6b63\u6570\u548c \\(2^{31}\\) \u4e2a\u8d1f\u6570\uff1b
  3. \u5f53\u6240\u6709 bits \u4e3a 0 \u65f6\u4ee3\u8868\u6570\u5b57 \\(0\\) \uff0c\u4ece\u96f6\u5f00\u59cb\u589e\u5927\uff0c\u53ef\u5f97\u6700\u5927\u6b63\u6570\u4e3a \\(2^{31} - 1\\) \uff1b
  4. \u5269\u4f59 \\(2^{31}\\) \u4e2a\u6570\u5b57\u5168\u90e8\u7528\u6765\u8868\u793a\u8d1f\u6570\uff0c\u56e0\u6b64\u6700\u5c0f\u8d1f\u6570\u4e3a \\(-2^{31}\\) \uff1b\u5177\u4f53\u7ec6\u8282\u6d89\u53ca\u201c\u6e90\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u201d\u7684\u76f8\u5173\u77e5\u8bc6\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u67e5\u9605\u5b66\u4e60\uff1b

\u5176\u4ed6\u6574\u6570\u7c7b\u578b byte, short, long \u7684\u53d6\u503c\u8303\u56f4\u7684\u8ba1\u7b97\u65b9\u6cd5\u4e0e int \u7c7b\u4f3c\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

"},{"location":"chapter_data_structure/data_and_memory/#_2","title":"\u6d6e\u70b9\u6570\u8868\u793a\u65b9\u5f0f *","text":"

Note

\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u540e\u7684 * \u7b26\u53f7\u4ee3\u8868\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u89c9\u5f97\u7406\u89e3\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u8df3\u8fc7\uff0c\u7b49\u5b66\u5b8c\u5fc5\u8bfb\u7ae0\u8282\u540e\u518d\u5355\u72ec\u653b\u514b\u3002

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 bytes\uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\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\u6839\u636e IEEE 754 \u6807\u51c6\uff0c32-bit \u957f\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u90e8\u5206\u6784\u6210\uff1a

  • \u7b26\u53f7\u4f4d \\(\\mathrm{S}\\) \uff1a\u5360 1 bit \uff1b
  • \u6307\u6570\u4f4d \\(\\mathrm{E}\\) \uff1a\u5360 8 bits \uff1b
  • \u5206\u6570\u4f4d \\(\\mathrm{N}\\) \uff1a\u5360 24 bits \uff0c\u5176\u4e2d 23 \u4f4d\u663e\u5f0f\u5b58\u50a8\uff1b

\u8bbe 32-bit \u4e8c\u8fdb\u5236\u6570\u7684\u7b2c \\(i\\) \u4f4d\u4e3a \\(b_i\\) \uff0c\u5219 float \u503c\u7684\u8ba1\u7b97\u65b9\u6cd5\u5b9a\u4e49\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

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

\u5176\u4e2d\u5404\u9879\u7684\u53d6\u503c\u8303\u56f4\u4e3a

\\[ \\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} \\]

Fig. IEEE 754 \u6807\u51c6\u4e0b\u7684 float \u8868\u793a\u65b9\u5f0f

\u4ee5\u4e0a\u56fe\u4e3a\u4f8b\uff0c\\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u6613\u5f97

\\[ \\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 \u4f4d\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

\u8fdb\u4e00\u6b65\u5730\uff0c\u6307\u6570\u4f4d \\(E = 0\\) \u548c \\(E = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u4e49\uff0c\u7528\u4e8e\u8868\u793a\u96f6\u3001\u65e0\u7a77\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

\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}\\)

\u7279\u522b\u5730\uff0c\u6b21\u6b63\u89c4\u6570\u663e\u8457\u63d0\u5347\u4e86\u6d6e\u70b9\u6570\u7684\u7cbe\u5ea6\uff0c\u8fd9\u662f\u56e0\u4e3a\uff1a

  • \u6700\u5c0f\u6b63\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\approx 1.18 \\times 10^{-38}\\) \uff1b
  • \u6700\u5c0f\u6b63\u6b21\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\times 2^{-23} \\approx 1.4 \\times 10^{-45}\\) \uff1b

\u53cc\u7cbe\u5ea6 double \u4e5f\u91c7\u7528\u7c7b\u4f3c float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u6b64\u5904\u4e0d\u518d\u8be6\u8ff0\u3002

"},{"location":"chapter_data_structure/data_and_memory/#_3","title":"\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u7684\u5173\u7cfb","text":"

\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\uff0c\u5b83\u7684\u6838\u5fc3\u662f\u201c\u7ed3\u6784\u201d\uff0c\u800c\u975e\u201c\u6570\u636e\u201d\u3002\u5982\u679c\u60f3\u8981\u8868\u793a\u201c\u4e00\u6392\u6570\u5b57\u201d\uff0c\u6211\u4eec\u81ea\u7136\u4f1a\u60f3\u5230\u4f7f\u7528\u300c\u6570\u7ec4\u300d\u6570\u636e\u7ed3\u6784\u3002\u6570\u7ec4\u7684\u5b58\u50a8\u65b9\u5f0f\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u3001\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5177\u4f53\u5b58\u50a8\u7684\u662f\u6574\u6570 int \u3001\u5c0f\u6570 float \u3001\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] booleans = new boolean[5];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool booleans[5];\n
# Python \u7684 list \u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\nlist = [0, 0.0, 'a', False]\n
// \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar booleans = [5]bool{}\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\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst booleans: boolean[] = [];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool booleans[10];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] booleans = new bool[5];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nlet numbers = Array(repeating: Int(), count: 5)\nlet decimals = Array(repeating: Double(), count: 5)\nlet characters = Array(repeating: Character(\"a\"), count: 5)\nlet booleans = Array(repeating: Bool(), count: 5)\n
\n
"},{"location":"chapter_data_structure/data_and_memory/#312","title":"3.1.2. \u00a0 \u8ba1\u7b97\u673a\u5185\u5b58","text":"

\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u5185\u5b58\u548c\u786c\u76d8\u662f\u4e24\u79cd\u4e3b\u8981\u7684\u5b58\u50a8\u786c\u4ef6\u8bbe\u5907\u3002\u300c\u786c\u76d8\u300d\u4e3b\u8981\u7528\u4e8e\u957f\u671f\u5b58\u50a8\u6570\u636e\uff0c\u5bb9\u91cf\u8f83\u5927\uff08\u901a\u5e38\u53ef\u8fbe\u5230 TB \u7ea7\u522b\uff09\u3001\u901f\u5ea6\u8f83\u6162\u3002\u300c\u5185\u5b58\u300d\u7528\u4e8e\u8fd0\u884c\u7a0b\u5e8f\u65f6\u6682\u5b58\u6570\u636e\uff0c\u901f\u5ea6\u8f83\u5feb\uff0c\u4f46\u5bb9\u91cf\u8f83\u5c0f\uff08\u901a\u5e38\u4e3a GB \u7ea7\u522b\uff09\u3002

\u5728\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u5173\u6570\u636e\u90fd\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u4e0b\u56fe\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 1 byte \u7684\u6570\u636e\uff0c\u5728\u7b97\u6cd5\u8fd0\u884c\u65f6\uff0c\u6240\u6709\u6570\u636e\u90fd\u88ab\u5b58\u50a8\u5728\u8fd9\u4e9b\u5355\u5143\u683c\u4e2d\u3002

\u7cfb\u7edf\u901a\u8fc7\u300c\u5185\u5b58\u5730\u5740 Memory Location\u300d\u6765\u8bbf\u95ee\u76ee\u6807\u5185\u5b58\u4f4d\u7f6e\u7684\u6570\u636e\u3002\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

Fig. \u5185\u5b58\u6761\u3001\u5185\u5b58\u7a7a\u95f4\u3001\u5185\u5b58\u5730\u5740

\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\u5185\u5b58\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u5f53\u5185\u5b58\u88ab\u67d0\u4e2a\u7a0b\u5e8f\u5360\u7528\u65f6\uff0c\u5176\u4ed6\u7a0b\u5e8f\u65e0\u6cd5\u540c\u65f6\u4f7f\u7528\u3002\u6211\u4eec\u9700\u8981\u6839\u636e\u5269\u4f59\u5185\u5b58\u8d44\u6e90\u7684\u5b9e\u9645\u60c5\u51b5\u6765\u8bbe\u8ba1\u7b97\u6cd5\u3002\u4f8b\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\u8fd0\u884c\u7684\u7a0b\u5e8f\u5f88\u591a\u5e76\u4e14\u7f3a\u5c11\u5927\u91cf\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u90a3\u4e48\u6240\u9009\u7528\u7684\u6570\u636e\u7ed3\u6784\u5fc5\u987b\u80fd\u591f\u5b58\u50a8\u5728\u79bb\u6563\u7684\u5185\u5b58\u7a7a\u95f4\u5185\u3002

"},{"location":"chapter_data_structure/summary/","title":"3.3. \u00a0 \u5c0f\u7ed3","text":"
  • \u8ba1\u7b97\u673a\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5305\u62ec\u6574\u6570 byte, short, int, long \u3001\u6d6e\u70b9\u6570 float, double \u3001\u5b57\u7b26 char \u548c\u5e03\u5c14 boolean \uff0c\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\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
  • \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\u548c\u975e\u7ebf\u6027\u7ed3\u6784\u3002
  • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u79bb\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
"},{"location":"chapter_graph/graph/","title":"10.1. \u00a0 \u56fe","text":"

\u300c\u56fe Graph\u300d\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u7531\u300c\u9876\u70b9 Vertex\u300d\u548c\u300c\u8fb9 Edge\u300d\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} \\]

Fig. \u94fe\u8868\u3001\u6811\u3001\u56fe\u4e4b\u95f4\u7684\u5173\u7cfb

\u90a3\u4e48\uff0c\u56fe\u4e0e\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u7684\u5173\u7cfb\u662f\u4ec0\u4e48\uff1f\u5982\u679c\u6211\u4eec\u628a\u300c\u9876\u70b9\u300d\u770b\u4f5c\u8282\u70b9\uff0c\u628a\u300c\u8fb9\u300d\u770b\u4f5c\u8fde\u63a5\u5404\u4e2a\u8282\u70b9\u7684\u6307\u9488\uff0c\u5219\u53ef\u5c06\u300c\u56fe\u300d\u770b\u4f5c\u662f\u4e00\u79cd\u4ece\u300c\u94fe\u8868\u300d\u62d3\u5c55\u800c\u6765\u7684\u6570\u636e\u7ed3\u6784\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\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u4ece\u800c\u66f4\u4e3a\u590d\u6742\u3002

"},{"location":"chapter_graph/graph/#1011","title":"10.1.1. \u00a0 \u56fe\u5e38\u89c1\u7c7b\u578b","text":"

\u6839\u636e\u8fb9\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u4e3a\u300c\u65e0\u5411\u56fe Undirected Graph\u300d\u548c\u300c\u6709\u5411\u56fe Directed Graph\u300d\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\uff1b
  • \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\uff1b

Fig. \u6709\u5411\u56fe\u4e0e\u65e0\u5411\u56fe

\u6839\u636e\u6240\u6709\u9876\u70b9\u662f\u5426\u8fde\u901a\uff0c\u53ef\u5206\u4e3a\u300c\u8fde\u901a\u56fe Connected Graph\u300d\u548c\u300c\u975e\u8fde\u901a\u56fe Disconnected Graph\u300d\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\uff1b
  • \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\uff1b

Fig. \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\u300c\u6709\u6743\u56fe Weighted Graph\u300d\u3002\u4f8b\u5982\uff0c\u5728\u738b\u8005\u8363\u8000\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

Fig. \u6709\u6743\u56fe\u4e0e\u65e0\u6743\u56fe

"},{"location":"chapter_graph/graph/#1012","title":"10.1.2. \u00a0 \u56fe\u5e38\u7528\u672f\u8bed","text":"
  • \u300c\u90bb\u63a5 Adjacency\u300d\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\u4e0a\u56fe\u4e2d\uff0c\u9876\u70b9 1 \u7684\u90bb\u63a5\u9876\u70b9\u4e3a\u9876\u70b9 2\u30013\u30015\u3002
  • \u300c\u8def\u5f84 Path\u300d\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\u4e0a\u56fe\u4e2d\uff0c\u8fb9\u5e8f\u5217 1-5-2-4 \u662f\u9876\u70b9 1 \u5230\u9876\u70b9 4 \u7684\u4e00\u6761\u8def\u5f84\u3002
  • \u300c\u5ea6 Degree\u300d\u8868\u793a\u4e00\u4e2a\u9876\u70b9\u62e5\u6709\u7684\u8fb9\u6570\u3002\u5bf9\u4e8e\u6709\u5411\u56fe\uff0c\u300c\u5165\u5ea6 In-Degree\u300d\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u6307\u5411\u8be5\u9876\u70b9\uff0c\u300c\u51fa\u5ea6 Out-Degree\u300d\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u4ece\u8be5\u9876\u70b9\u6307\u51fa\u3002
"},{"location":"chapter_graph/graph/#1013","title":"10.1.3. \u00a0 \u56fe\u7684\u8868\u793a","text":"

\u56fe\u7684\u5e38\u7528\u8868\u793a\u65b9\u6cd5\u5305\u62ec\u300c\u90bb\u63a5\u77e9\u9635\u300d\u548c\u300c\u90bb\u63a5\u8868\u300d\u3002\u4ee5\u4e0b\u4f7f\u7528\u65e0\u5411\u56fe\u8fdb\u884c\u4e3e\u4f8b\u3002

"},{"location":"chapter_graph/graph/#_1","title":"\u90bb\u63a5\u77e9\u9635","text":"

\u8bbe\u56fe\u7684\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u300c\u90bb\u63a5\u77e9\u9635 Adjacency Matrix\u300d\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\u4e0b\u56fe\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

Fig. \u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a

\u90bb\u63a5\u77e9\u9635\u5177\u6709\u4ee5\u4e0b\u7279\u6027\uff1a

  • \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\\) , \\(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\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":"\u90bb\u63a5\u8868","text":"

\u300c\u90bb\u63a5\u8868 Adjacency List\u300d\u4f7f\u7528 \\(n\\) \u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u94fe\u8868\u8282\u70b9\u8868\u793a\u9876\u70b9\u3002\u7b2c \\(i\\) \u6761\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff08\u5373\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u9876\u70b9\uff09\u3002

Fig. \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\u4e0a\u56fe\u53ef\u53d1\u73b0\uff0c\u90bb\u63a5\u8868\u7ed3\u6784\u4e0e\u54c8\u5e0c\u8868\u4e2d\u7684\u300c\u94fe\u5730\u5740\u6cd5\u300d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u4eec\u4e5f\u53ef\u4ee5\u91c7\u7528\u7c7b\u4f3c\u65b9\u6cd5\u6765\u4f18\u5316\u6548\u7387\u3002\u4f8b\u5982\uff0c\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)\\) \uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u4e2d\u5e8f\u904d\u5386\u83b7\u53d6\u6709\u5e8f\u5e8f\u5217\uff1b\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u54c8\u5e0c\u8868\uff0c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u4f4e\u81f3 \\(O(1)\\) \u3002

"},{"location":"chapter_graph/graph/#1014","title":"10.1.4. \u00a0 \u56fe\u5e38\u89c1\u5e94\u7528","text":"

\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u8bb8\u591a\u7cfb\u7edf\u90fd\u53ef\u4ee5\u7528\u56fe\u6765\u5efa\u6a21\uff0c\u76f8\u5e94\u7684\u5f85\u6c42\u89e3\u95ee\u9898\u4e5f\u53ef\u4ee5\u7ea6\u5316\u4e3a\u56fe\u8ba1\u7b97\u95ee\u9898\u3002

\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":"10.2. \u00a0 \u56fe\u57fa\u7840\u64cd\u4f5c","text":"

\u56fe\u7684\u57fa\u7840\u64cd\u4f5c\u53ef\u5206\u4e3a\u5bf9\u300c\u8fb9\u300d\u7684\u64cd\u4f5c\u548c\u5bf9\u300c\u9876\u70b9\u300d\u7684\u64cd\u4f5c\u3002\u5728\u300c\u90bb\u63a5\u77e9\u9635\u300d\u548c\u300c\u90bb\u63a5\u8868\u300d\u4e24\u79cd\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5b9e\u73b0\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

"},{"location":"chapter_graph/graph_operations/#1021","title":"10.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\u6709\uff1a

  • \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

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u7684\u5b9e\u73b0\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_adjacency_matrix.java
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nList<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\nList<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u65b9\u6cd5 */\npublic GraphAdjMat(int[] vertices, int[][] edges) {\nthis.vertices = new ArrayList<>();\nthis.adjMat = new ArrayList<>();\n// \u6dfb\u52a0\u9876\u70b9\nfor (int val : vertices) {\naddVertex(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\nfor (int[] e : edges) {\naddEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size() {\nreturn vertices.size();\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(int val) {\nint n = size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.add(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nList<Integer> newRow = new ArrayList<>(n);\nfor (int j = 0; j < n; j++) {\nnewRow.add(0);\n}\nadjMat.add(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (List<Integer> row : adjMat) {\nrow.add(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(int index) {\nif (index >= size())\nthrow new IndexOutOfBoundsException();\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.remove(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.remove(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (List<Integer> row : adjMat) {\nrow.remove(index);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void addEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfBoundsException();\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat.get(i).set(j, 1);\nadjMat.get(j).set(i, 1);\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void removeEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfBoundsException();\nadjMat.get(i).set(j, 0);\nadjMat.get(j).set(i, 0);\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\npublic void print() {\nSystem.out.print(\"\u9876\u70b9\u5217\u8868 = \");\nSystem.out.println(vertices);\nSystem.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\nPrintUtil.printMatrix(adjMat);\n}\n}\n
graph_adjacency_matrix.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nvector<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\nvector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nGraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n// \u6dfb\u52a0\u9876\u70b9\nfor (int val : vertices) {\naddVertex(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\nfor (const vector<int> &edge : edges) {\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nint size() const {\nreturn vertices.size();\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(int val) {\nint n = size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.push_back(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nadjMat.emplace_back(n, 0);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (vector<int> &row : adjMat) {\nrow.push_back(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(int index) {\nif (index >= size()) {\nthrow out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.erase(vertices.begin() + index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.erase(adjMat.begin() + index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (vector<int> &row : adjMat) {\nrow.erase(row.begin() + index);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\nthrow out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat[i][j] = 1;\nadjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\nthrow out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n}\nadjMat[i][j] = 0;\nadjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid print() {\ncout << \"\u9876\u70b9\u5217\u8868 = \";\nprintVector(vertices);\ncout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\nprintVectorMatrix(adjMat);\n}\n};\n
graph_adjacency_matrix.py
class GraphAdjMat:\n\"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\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\nvertices: list[int] = []\n# \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\nadj_mat: list[list[int]] = []\ndef __init__(self, vertices: list[int], edges: list[list[int]]) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.vertices: list[int] = []\nself.adj_mat: list[list[int]] = []\n# \u6dfb\u52a0\u9876\u70b9\nfor val in vertices:\nself.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\nfor e in edges:\nself.add_edge(e[0], e[1])\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\nreturn len(self.vertices)\ndef add_vertex(self, val: int) -> None:\n\"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\nn = self.size()\n# \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nself.vertices.append(val)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nnew_row = [0] * n\nself.adj_mat.append(new_row)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor row in self.adj_mat:\nrow.append(0)\ndef remove_vertex(self, index: int) -> None:\n\"\"\"\u5220\u9664\u9876\u70b9\"\"\"\nif index >= self.size():\nraise IndexError()\n# \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nself.vertices.pop(index)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nself.adj_mat.pop(index)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor row in self.adj_mat:\nrow.pop(index)\ndef add_edge(self, i: int, j: int) -> None:\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\nif i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\nraise IndexError()\n# \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nself.adj_mat[i][j] = 1\nself.adj_mat[j][i] = 1\ndef remove_edge(self, i: int, j: int) -> None:\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\nif i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\nraise IndexError()\nself.adj_mat[i][j] = 0\nself.adj_mat[j][i] = 0\ndef print(self) -> None:\n\"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\nprint(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\nprint(\"\u90bb\u63a5\u77e9\u9635 =\")\nprint_matrix(self.adj_mat)\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\nvertices []int\n// \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\nadjMat [][]int\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n// \u6dfb\u52a0\u9876\u70b9\nn := len(vertices)\nadjMat := make([][]int, n)\nfor i := range adjMat {\nadjMat[i] = make([]int, n)\n}\n// \u521d\u59cb\u5316\u56fe\ng := &graphAdjMat{\nvertices: vertices,\nadjMat:   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\nfor i := range edges {\ng.addEdge(edges[i][0], edges[i][1])\n}\nreturn g\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\nreturn len(g.vertices)\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\nn := g.size()\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\ng.vertices = append(g.vertices, val)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nnewRow := make([]int, n)\ng.adjMat = append(g.adjMat, newRow)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor i := range g.adjMat {\ng.adjMat[i] = append(g.adjMat[i], 0)\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\nif index >= g.size() {\nreturn\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\ng.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\ng.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor i := range g.adjMat {\ng.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\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\nif i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\nfmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\ng.adjMat[i][j] = 1\ng.adjMat[j][i] = 1\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\nif i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\nfmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n}\ng.adjMat[i][j] = 0\ng.adjMat[j][i] = 0\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\nfmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\nfmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\nfor i := range g.adjMat {\nfmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n}\n}\n
graph_adjacency_matrix.js
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nvertices; // \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\nadjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u51fd\u6570 */\nconstructor(vertices, edges) {\nthis.vertices = [];\nthis.adjMat = [];\n// \u6dfb\u52a0\u9876\u70b9\nfor (const val of vertices) {\nthis.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\nfor (const e of edges) {\nthis.addEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize() {\nreturn this.vertices.length;\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(val) {\nconst n = this.size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nthis.vertices.push(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nconst newRow = [];\nfor (let j = 0; j < n; j++) {\nnewRow.push(0);\n}\nthis.adjMat.push(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (const row of this.adjMat) {\nrow.push(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(index) {\nif (index >= this.size()) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nthis.vertices.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nthis.adjMat.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (const row of this.adjMat) {\nrow.splice(index, 1);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\naddEdge(i, j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nthis.adjMat[i][j] = 1;\nthis.adjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nremoveEdge(i, j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\nthis.adjMat[i][j] = 0;\nthis.adjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nprint() {\nconsole.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\nconsole.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 {\nvertices: 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\nadjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u51fd\u6570 */\nconstructor(vertices: number[], edges: number[][]) {\nthis.vertices = [];\nthis.adjMat = [];\n// \u6dfb\u52a0\u9876\u70b9\nfor (const val of vertices) {\nthis.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\nfor (const e of edges) {\nthis.addEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize(): number {\nreturn this.vertices.length;\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(val: number): void {\nconst n: number = this.size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nthis.vertices.push(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nconst newRow: number[] = [];\nfor (let j: number = 0; j < n; j++) {\nnewRow.push(0);\n}\nthis.adjMat.push(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (const row of this.adjMat) {\nrow.push(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(index: number): void {\nif (index >= this.size()) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nthis.vertices.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nthis.adjMat.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (const row of this.adjMat) {\nrow.splice(index, 1);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\naddEdge(i: number, j: number): void {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nthis.adjMat[i][j] = 1;\nthis.adjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nremoveEdge(i: number, j: number): void {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\nthis.adjMat[i][j] = 0;\nthis.adjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nprint(): void {\nconsole.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\nconsole.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n}\n}\n
graph_adjacency_matrix.c
[class]{graphAdjMat}-[func]{}\n
graph_adjacency_matrix.cs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat\n{\nList<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\nList<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u51fd\u6570 */\npublic GraphAdjMat(int[] vertices, int[][] edges)\n{\nthis.vertices = new List<int>();\nthis.adjMat = new List<List<int>>();\n// \u6dfb\u52a0\u9876\u70b9\nforeach (int val in vertices)\n{\naddVertex(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\nforeach (int[] e in edges)\n{\naddEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size()\n{\nreturn vertices.Count;\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(int val)\n{\nint n = size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.Add(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nList<int> newRow = new List<int>(n);\nfor (int j = 0; j < n; j++)\n{\nnewRow.Add(0);\n}\nadjMat.Add(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nforeach (List<int> row in adjMat)\n{\nrow.Add(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(int index)\n{\nif (index >= size())\nthrow new IndexOutOfRangeException();\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.RemoveAt(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.RemoveAt(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nforeach (List<int> row in adjMat)\n{\nrow.RemoveAt(index);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void addEdge(int i, int j)\n{\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfRangeException();\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat[i][j] = 1;\nadjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void removeEdge(int i, int j)\n{\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfRangeException();\nadjMat[i][j] = 0;\nadjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\npublic void print()\n{\nConsole.Write(\"\u9876\u70b9\u5217\u8868 = \");\nPrintUtil.PrintList(vertices);\nConsole.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\nPrintUtil.printMatrix(adjMat);\n}\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nprivate 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\nprivate var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u65b9\u6cd5 */\ninit(vertices: [Int], edges: [[Int]]) {\nself.vertices = []\nadjMat = []\n// \u6dfb\u52a0\u9876\u70b9\nfor val in vertices {\naddVertex(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\nfor e in edges {\naddEdge(i: e[0], j: e[1])\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc size() -> Int {\nvertices.count\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc addVertex(val: Int) {\nlet n = size()\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.append(val)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nlet newRow = Array(repeating: 0, count: n)\nadjMat.append(newRow)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor i in adjMat.indices {\nadjMat[i].append(0)\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nfunc removeVertex(index: Int) {\nif index >= size() {\nfatalError(\"\u8d8a\u754c\")\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.remove(at: index)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.remove(at: index)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor i in adjMat.indices {\nadjMat[i].remove(at: index)\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc addEdge(i: Int, j: Int) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif i < 0 || j < 0 || i >= size() || j >= size() || i == j {\nfatalError(\"\u8d8a\u754c\")\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat[i][j] = 1\nadjMat[j][i] = 1\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc removeEdge(i: Int, j: Int) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif i < 0 || j < 0 || i >= size() || j >= size() || i == j {\nfatalError(\"\u8d8a\u754c\")\n}\nadjMat[i][j] = 0\nadjMat[j][i] = 0\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc print() {\nSwift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\nSwift.print(vertices)\nSwift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\nPrintUtil.printMatrix(matrix: adjMat)\n}\n}\n
graph_adjacency_matrix.zig
\n
"},{"location":"chapter_graph/graph_operations/#1022","title":"10.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\u6709\uff1a

  • \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(1)\\) \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

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u56fe\u7684\u4ee3\u7801\u793a\u4f8b\u3002\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u6ce8\u610f\u5230\uff0c\u6211\u4eec\u5728\u90bb\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u8282\u70b9\u7c7b\u6765\u8868\u793a\u9876\u70b9\uff0c\u8fd9\u6837\u505a\u7684\u539f\u56e0\u6709\uff1a

  • \u5982\u679c\u6211\u4eec\u9009\u62e9\u901a\u8fc7\u9876\u70b9\u503c\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\uff0c\u90a3\u4e48\u503c\u91cd\u590d\u7684\u9876\u70b9\u5c06\u65e0\u6cd5\u88ab\u533a\u5206\u3002
  • \u5982\u679c\u7c7b\u4f3c\u90bb\u63a5\u77e9\u9635\u90a3\u6837\uff0c\u4f7f\u7528\u9876\u70b9\u5217\u8868\u7d22\u5f15\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\u3002\u90a3\u4e48\uff0c\u5047\u8bbe\u6211\u4eec\u60f3\u8981\u5220\u9664\u7d22\u5f15\u4e3a \\(i\\) \u7684\u9876\u70b9\uff0c\u5219\u9700\u8981\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5c06\u5176\u4e2d \\(> i\\) \u7684\u7d22\u5f15\u5168\u90e8\u51cf \\(1\\) \uff0c\u8fd9\u6837\u64cd\u4f5c\u6548\u7387\u8f83\u4f4e\u3002
  • \u56e0\u6b64\u6211\u4eec\u8003\u8651\u5f15\u5165\u9876\u70b9\u7c7b Vertex \uff0c\u4f7f\u5f97\u6bcf\u4e2a\u9876\u70b9\u90fd\u662f\u552f\u4e00\u7684\u5bf9\u8c61\uff0c\u6b64\u65f6\u5220\u9664\u9876\u70b9\u65f6\u5c31\u65e0\u9700\u6539\u52a8\u5176\u4f59\u9876\u70b9\u4e86\u3002
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_adjacency_list.java
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n// \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nMap<Vertex, List<Vertex>> adjList;\n/* \u6784\u9020\u65b9\u6cd5 */\npublic GraphAdjList(Vertex[][] edges) {\nthis.adjList = new HashMap<>();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (Vertex[] edge : edges) {\naddVertex(edge[0]);\naddVertex(edge[1]);\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size() {\nreturn adjList.size();\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic void addEdge(Vertex vet1, Vertex vet2) {\nif (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\nthrow new IllegalArgumentException();\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList.get(vet1).add(vet2);\nadjList.get(vet2).add(vet1);\n}\n/* \u5220\u9664\u8fb9 */\npublic void removeEdge(Vertex vet1, Vertex vet2) {\nif (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\nthrow new IllegalArgumentException();\n// \u5220\u9664\u8fb9 vet1 - vet2\nadjList.get(vet1).remove(vet2);\nadjList.get(vet2).remove(vet1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(Vertex vet) {\nif (adjList.containsKey(vet))\nreturn;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList.put(vet, new ArrayList<>());\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(Vertex vet) {\nif (!adjList.containsKey(vet))\nthrow new IllegalArgumentException();\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.remove(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (List<Vertex> list : adjList.values()) {\nlist.remove(vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic void print() {\nSystem.out.println(\"\u90bb\u63a5\u8868 =\");\nfor (Map.Entry<Vertex, List<Vertex>> entry : adjList.entrySet()) {\nList<Integer> tmp = new ArrayList<>();\nfor (Vertex vertex : entry.getValue())\ntmp.add(vertex.val);\nSystem.out.println(entry.getKey().val + \": \" + tmp + \",\");\n}\n}\n}\n
graph_adjacency_list.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\npublic:\n// \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nunordered_map<Vertex *, vector<Vertex *>> adjList;\n/* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\nvoid remove(vector<Vertex *> &vec, Vertex *vet) {\nfor (int i = 0; i < vec.size(); i++) {\nif (vec[i] == vet) {\nvec.erase(vec.begin() + i);\nbreak;\n}\n}\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nGraphAdjList(const vector<vector<Vertex *>> &edges) {\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (const vector<Vertex *> &edge : edges) {\naddVertex(edge[0]);\naddVertex(edge[1]);\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nint size() {\nreturn adjList.size();\n}\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(Vertex *vet1, Vertex *vet2) {\nif (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\nthrow invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList[vet1].push_back(vet2);\nadjList[vet2].push_back(vet1);\n}\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(Vertex *vet1, Vertex *vet2) {\nif (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\nthrow invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n// \u5220\u9664\u8fb9 vet1 - vet2\nremove(adjList[vet1], vet2);\nremove(adjList[vet2], vet1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(Vertex *vet) {\nif (adjList.count(vet))\nreturn;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList[vet] = vector<Vertex *>();\n}\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(Vertex *vet) {\nif (!adjList.count(vet))\nthrow invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.erase(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (auto &adj : adjList) {\nremove(adj.second, vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nvoid print() {\ncout << \"\u90bb\u63a5\u8868 =\" << endl;\nfor (auto &adj : adjList) {\nconst auto &key = adj.first;\nconst auto &vec = adj.second;\ncout << key->val << \": \";\nprintVector(vetsToVals(vec));\n}\n}\n};\n
graph_adjacency_list.py
class GraphAdjList:\n\"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\ndef __init__(self, edges: list[list[Vertex]]) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n# \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nself.adj_list = dict[Vertex, Vertex]()\n# \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor edge in edges:\nself.add_vertex(edge[0])\nself.add_vertex(edge[1])\nself.add_edge(edge[0], edge[1])\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\nreturn len(self.adj_list)\ndef add_edge(self, vet1: Vertex, vet2: Vertex) -> None:\n\"\"\"\u6dfb\u52a0\u8fb9\"\"\"\nif vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\nraise ValueError\n# \u6dfb\u52a0\u8fb9 vet1 - vet2\nself.adj_list[vet1].append(vet2)\nself.adj_list[vet2].append(vet1)\ndef remove_edge(self, vet1: Vertex, vet2: Vertex) -> None:\n\"\"\"\u5220\u9664\u8fb9\"\"\"\nif vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\nraise ValueError\n# \u5220\u9664\u8fb9 vet1 - vet2\nself.adj_list[vet1].remove(vet2)\nself.adj_list[vet2].remove(vet1)\ndef add_vertex(self, vet: Vertex) -> None:\n\"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\nif vet in self.adj_list:\nreturn\n# \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nself.adj_list[vet] = []\ndef remove_vertex(self, vet: Vertex) -> None:\n\"\"\"\u5220\u9664\u9876\u70b9\"\"\"\nif vet not in self.adj_list:\nraise ValueError\n# \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nself.adj_list.pop(vet)\n# \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor vertex in self.adj_list:\nif vet in self.adj_list[vertex]:\nself.adj_list[vertex].remove(vet)\ndef print(self) -> None:\n\"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\nprint(\"\u90bb\u63a5\u8868 =\")\nfor vertex in self.adj_list:\ntmp = [v.val for v in self.adj_list[vertex]]\nprint(f\"{vertex.val}: {tmp},\")\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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nadjList map[Vertex][]Vertex\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\ng := &graphAdjList{\nadjList: make(map[Vertex][]Vertex),\n}\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor _, edge := range edges {\ng.addVertex(edge[0])\ng.addVertex(edge[1])\ng.addEdge(edge[0], edge[1])\n}\nreturn g\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\nreturn len(g.adjList)\n}\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n_, ok1 := g.adjList[vet1]\n_, ok2 := g.adjList[vet2]\nif !ok1 || !ok2 || vet1 == vet2 {\npanic(\"error\")\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\ng.adjList[vet1] = append(g.adjList[vet1], vet2)\ng.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n_, ok1 := g.adjList[vet1]\n_, ok2 := g.adjList[vet2]\nif !ok1 || !ok2 || vet1 == vet2 {\npanic(\"error\")\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nDeleteSliceElms(g.adjList[vet1], vet2)\nDeleteSliceElms(g.adjList[vet2], vet1)\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n_, ok := g.adjList[vet]\nif ok {\nreturn\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\ng.adjList[vet] = make([]Vertex, 0)\n}\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n_, ok := g.adjList[vet]\nif !ok {\npanic(\"error\")\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\ndelete(g.adjList, vet)\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor _, list := range g.adjList {\nDeleteSliceElms(list, vet)\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\nvar builder strings.Builder\nfmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\nfor k, v := range g.adjList {\nbuilder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\nfor _, vet := range v {\nbuilder.WriteString(strconv.Itoa(vet.Val) + \" \")\n}\nfmt.Println(builder.String())\nbuilder.Reset()\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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nadjList;\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(edges) {\nthis.adjList = new Map();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (const edge of edges) {\nthis.addVertex(edge[0]);\nthis.addVertex(edge[1]);\nthis.addEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize() {\nreturn this.adjList.size;\n}\n/* \u6dfb\u52a0\u8fb9 */\naddEdge(vet1, vet2) {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).push(vet2);\nthis.adjList.get(vet2).push(vet1);\n}\n/* \u5220\u9664\u8fb9 */\nremoveEdge(vet1, vet2) {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\nthis.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(vet) {\nif (this.adjList.has(vet)) return;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nthis.adjList.set(vet, []);\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(vet) {\nif (!this.adjList.has(vet)) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nthis.adjList.delete(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (let set of this.adjList.values()) {\nconst index = set.indexOf(vet);\nif (index > -1) {\nset.splice(index, 1);\n}\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nprint() {\nconsole.log('\u90bb\u63a5\u8868 =');\nfor (const [key, value] of this.adjList) {\nconst tmp = [];\nfor (const vertex of value) {\ntmp.push(vertex.val);\n}\nconsole.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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nadjList: Map<Vertex, Vertex[]>;\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(edges: Vertex[][]) {\nthis.adjList = new Map();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (const edge of edges) {\nthis.addVertex(edge[0]);\nthis.addVertex(edge[1]);\nthis.addEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize(): number {\nreturn this.adjList.size;\n}\n/* \u6dfb\u52a0\u8fb9 */\naddEdge(vet1: Vertex, vet2: Vertex): void {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).push(vet2);\nthis.adjList.get(vet2).push(vet1);\n}\n/* \u5220\u9664\u8fb9 */\nremoveEdge(vet1: Vertex, vet2: Vertex): void {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\nthis.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(vet: Vertex): void {\nif (this.adjList.has(vet)) return;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nthis.adjList.set(vet, []);\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(vet: Vertex): void {\nif (!this.adjList.has(vet)) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nthis.adjList.delete(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (let set of this.adjList.values()) {\nconst index: number = set.indexOf(vet);\nif (index > -1) {\nset.splice(index, 1);\n}\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nprint(): void {\nconsole.log('\u90bb\u63a5\u8868 =');\nfor (const [key, value] of this.adjList.entries()) {\nconst tmp = [];\nfor (const vertex of value) {\ntmp.push(vertex.val);\n}\nconsole.log(key.val + ': ' + tmp.join());\n}\n}\n}\n
graph_adjacency_list.c
[class]{graphAdjList}-[func]{}\n
graph_adjacency_list.cs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList\n{\n// \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\npublic Dictionary<Vertex, List<Vertex>> adjList;\n/* \u6784\u9020\u51fd\u6570 */\npublic GraphAdjList(Vertex[][] edges)\n{\nthis.adjList = new Dictionary<Vertex, List<Vertex>>();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nforeach (Vertex[] edge in edges)\n{\naddVertex(edge[0]);\naddVertex(edge[1]);\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size()\n{\nreturn adjList.Count;\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic void addEdge(Vertex vet1, Vertex vet2)\n{\nif (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\nthrow new InvalidOperationException();\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList[vet1].Add(vet2);\nadjList[vet2].Add(vet1);\n}\n/* \u5220\u9664\u8fb9 */\npublic void removeEdge(Vertex vet1, Vertex vet2)\n{\nif (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\nthrow new InvalidOperationException();\n// \u5220\u9664\u8fb9 vet1 - vet2\nadjList[vet1].Remove(vet2);\nadjList[vet2].Remove(vet1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(Vertex vet)\n{\nif (adjList.ContainsKey(vet))\nreturn;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList.Add(vet, new List<Vertex>());\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(Vertex vet)\n{\nif (!adjList.ContainsKey(vet))\nthrow new InvalidOperationException();\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.Remove(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nforeach (List<Vertex> list in adjList.Values)\n{\nlist.Remove(vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic void print()\n{\nConsole.WriteLine(\"\u90bb\u63a5\u8868 =\");\nforeach (KeyValuePair<Vertex, List<Vertex>> entry in adjList)\n{\nList<int> tmp = new List<int>();\nforeach (Vertex vertex in entry.Value)\ntmp.Add(vertex.Val);\nConsole.WriteLine(entry.Key.Val + \": [\" + string.Join(\", \", tmp) + \"],\");\n}\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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\npublic private(set) var adjList: [Vertex: [Vertex]]\n/* \u6784\u9020\u65b9\u6cd5 */\npublic init(edges: [[Vertex]]) {\nadjList = [:]\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor edge in edges {\naddVertex(vet: edge[0])\naddVertex(vet: edge[1])\naddEdge(vet1: edge[0], vet2: edge[1])\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic func size() -> Int {\nadjList.count\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic func addEdge(vet1: Vertex, vet2: Vertex) {\nif adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\nfatalError(\"\u53c2\u6570\u9519\u8bef\")\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList[vet1]?.append(vet2)\nadjList[vet2]?.append(vet1)\n}\n/* \u5220\u9664\u8fb9 */\npublic func removeEdge(vet1: Vertex, vet2: Vertex) {\nif adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\nfatalError(\"\u53c2\u6570\u9519\u8bef\")\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nadjList[vet1]?.removeAll(where: { $0 == vet2 })\nadjList[vet2]?.removeAll(where: { $0 == vet1 })\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic func addVertex(vet: Vertex) {\nif adjList[vet] != nil {\nreturn\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList[vet] = []\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic func removeVertex(vet: Vertex) {\nif adjList[vet] == nil {\nfatalError(\"\u53c2\u6570\u9519\u8bef\")\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.removeValue(forKey: vet)\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor key in adjList.keys {\nadjList[key]?.removeAll(where: { $0 == vet })\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic func print() {\nSwift.print(\"\u90bb\u63a5\u8868 =\")\nfor entry in adjList {\nvar tmp: [Int] = []\nfor vertex in entry.value {\ntmp.append(vertex.val)\n}\nSwift.print(\"\\(entry.key.val): \\(tmp),\")\n}\n}\n}\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
"},{"location":"chapter_graph/graph_operations/#1023","title":"10.2.3. \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

\u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\u4e0b\u8868\u4e3a\u90bb\u63a5\u77e9\u9635\u548c\u90bb\u63a5\u8868\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u6548\u7387\u5bf9\u6bd4\u3002

\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\u4e0a\u8868\uff0c\u4f3c\u4e4e\u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09\u7684\u65f6\u95f4\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\u8981\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":"10.3. \u00a0 \u56fe\u7684\u904d\u5386","text":"

\u56fe\u4e0e\u6811\u7684\u5173\u7cfb

\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\u662f\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\uff0c\u5efa\u8bae\u4f60\u5728\u5b66\u4e60\u672c\u7ae0\u8282\u65f6\u878d\u4f1a\u8d2f\u901a\u4e24\u8005\u7684\u6982\u5ff5\u4e0e\u5b9e\u73b0\u65b9\u6cd5\u3002

\u300c\u56fe\u300d\u548c\u300c\u6811\u300d\u90fd\u662f\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u90fd\u9700\u8981\u4f7f\u7528\u300c\u641c\u7d22\u7b97\u6cd5\u300d\u6765\u5b9e\u73b0\u904d\u5386\u64cd\u4f5c\u3002

\u4e0e\u6811\u7c7b\u4f3c\uff0c\u56fe\u7684\u904d\u5386\u65b9\u5f0f\u4e5f\u53ef\u5206\u4e3a\u4e24\u79cd\uff0c\u5373\u300c\u5e7f\u5ea6\u4f18\u5148\u904d\u5386 Breadth-First Traversal\u300d\u548c\u300c\u6df1\u5ea6\u4f18\u5148\u904d\u5386 Depth-First Traversal\u300d\uff0c\u4e5f\u79f0\u4e3a\u300c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 Breadth-First Search\u300d\u548c\u300c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22 Depth-First Search\u300d\uff0c\u7b80\u79f0 BFS \u548c DFS\u3002

"},{"location":"chapter_graph/graph_traversal/#1031","title":"10.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\u8ddd\u79bb\u6700\u8fd1\u7684\u9876\u70b9\u5f00\u59cb\u8bbf\u95ee\uff0c\u5e76\u4e00\u5c42\u5c42\u5411\u5916\u6269\u5f20\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\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

Fig. \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#_1","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"

BFS \u901a\u5e38\u501f\u52a9\u300c\u961f\u5217\u300d\u6765\u5b9e\u73b0\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\uff1b
  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\uff1b
  3. \u5faa\u73af\u6b65\u9aa4 2. \uff0c\u76f4\u5230\u6240\u6709\u9876\u70b9\u88ab\u8bbf\u95ee\u5b8c\u6210\u540e\u7ed3\u675f\uff1b

\u4e3a\u4e86\u9632\u6b62\u91cd\u590d\u904d\u5386\u9876\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_bfs.java
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nList<Vertex> res = new ArrayList<>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nSet<Vertex> visited = new HashSet<>() {{ add(startVet); }};\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nQueue<Vertex> que = new LinkedList<>() {{ offer(startVet); }};\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (!que.isEmpty()) {\nVertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (Vertex adjVet : graph.adjList.get(vet)) {\nif (visited.contains(adjVet))\ncontinue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nque.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.cpp
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nvector<Vertex *> res;\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nunordered_set<Vertex *> visited = {startVet};\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nqueue<Vertex *> que;\nque.push(startVet);\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (!que.empty()) {\nVertex *vet = que.front();\nque.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (auto adjVet : graph.adjList[vet]) {\nif (visited.count(adjVet))\ncontinue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nque.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n\"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS\"\"\"\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\nres = []\n# \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited = set[Vertex]([start_vet])\n# \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nque = deque[Vertex]([start_vet])\n# \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile len(que) > 0:\nvet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n# \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adj_vet in graph.adj_list[vet]:\nif adj_vet in visited:\ncontinue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nque.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n# \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n
graph_bfs.go
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nres := make([]Vertex, 0)\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited := make(map[Vertex]struct{})\nvisited[startVet] = struct{}{}\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\nqueue := make([]Vertex, 0)\nqueue = append(queue, startVet)\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nfor len(queue) > 0 {\n// \u961f\u9996\u9876\u70b9\u51fa\u961f\nvet := queue[0]\nqueue = queue[1:]\n// \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nres = append(res, vet)\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor _, adjVet := range g.adjList[vet] {\n_, isExist := visited[adjVet]\n// \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nif !isExist {\nqueue = append(queue, adjVet)\nvisited[adjVet] = struct{}{}\n}\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n}\n
graph_bfs.js
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nconst res = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited = new Set();\nvisited.add(startVet);\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nconst que = [startVet];\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (que.length) {\nconst vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet) ?? []) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.ts
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nconst res: Vertex[] = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited: Set<Vertex> = new Set();\nvisited.add(startVet);\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nconst que = [startVet];\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (que.length) {\nconst vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet) ?? []) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\nvisited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.c
[class]{}-[func]{graphBFS}\n
graph_bfs.cs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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{\n// \u9876\u70b9\u904d\u5386\u5e8f\u5217\nList<Vertex> res = new List<Vertex>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nHashSet<Vertex> visited = new HashSet<Vertex>() { startVet };\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nQueue<Vertex> que = new Queue<Vertex>();\nque.Enqueue(startVet);\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (que.Count > 0)\n{\nVertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nforeach (Vertex adjVet in graph.adjList[vet])\n{\nif (visited.Contains(adjVet))\n{\ncontinue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.swift
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nvar res: [Vertex] = []\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvar visited: Set<Vertex> = [startVet]\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nvar que: [Vertex] = [startVet]\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile !que.isEmpty {\nlet vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adjVet in graph.adjList[vet] ?? [] {\nif visited.contains(adjVet) {\ncontinue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n}\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n

\u4ee3\u7801\u76f8\u5bf9\u62bd\u8c61\uff0c\u5efa\u8bae\u5bf9\u7167\u4ee5\u4e0b\u52a8\u753b\u56fe\u793a\u6765\u52a0\u6df1\u7406\u89e3\u3002

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

\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\u662f\u5141\u8bb8\u88ab\u4efb\u610f\u6253\u4e71\u7684\u3002\u4ee5\u4e0a\u56fe\u4e3a\u4f8b\uff0c\u9876\u70b9 \\(1\\) , \\(3\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\u3001\u9876\u70b9 \\(2\\) , \\(4\\) , \\(6\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u6362\u3002

"},{"location":"chapter_graph/graph_traversal/#_2","title":"\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\u8868 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/#1032","title":"10.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\u5177\u4f53\u5730\uff0c\u4ece\u67d0\u4e2a\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

Fig. \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#_3","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"

\u8fd9\u79cd\u201c\u8d70\u5230\u5c3d\u5934 + \u56de\u6eaf\u201d\u7684\u7b97\u6cd5\u5f62\u5f0f\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002\u4e0e BFS \u7c7b\u4f3c\uff0c\u5728 DFS \u4e2d\u6211\u4eec\u4e5f\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 visited \u6765\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\uff0c\u4ee5\u907f\u514d\u91cd\u590d\u8bbf\u95ee\u9876\u70b9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_dfs.java
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\nres.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (Vertex adjVet : graph.adjList.get(vet)) {\nif (visited.contains(adjVet))\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nList<Vertex> res = new ArrayList<>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nSet<Vertex> visited = new HashSet<>();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.cpp
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\nres.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (Vertex *adjVet : graph.adjList[vet]) {\nif (visited.count(adjVet))\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nvector<Vertex *> res;\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nunordered_set<Vertex *> visited;\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n\"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570\"\"\"\nres.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n# \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adjVet in graph.adj_list[vet]:\nif adjVet in visited:\ncontinue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n# \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet)\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n\"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS\"\"\"\n# \u9876\u70b9\u904d\u5386\u5e8f\u5217\nres = []\n# \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited = set[Vertex]()\ndfs(graph, visited, res, start_vet)\nreturn res\n
graph_dfs.go
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \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)\nvisited[vet] = struct{}{}\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor _, adjVet := range g.adjList[vet] {\n_, isExist := visited[adjVet]\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\nif !isExist {\ndfs(g, visited, res, adjVet)\n}\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nres := make([]Vertex, 0)\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited := make(map[Vertex]struct{})\ndfs(g, visited, &res, startVet)\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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) {\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet)) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nconst res = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited = new Set();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\ngraph: GraphAdjList,\nvisited: Set<Vertex>,\nres: Vertex[],\nvet: Vertex\n): void {\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet)) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nconst res: Vertex[] = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited: Set<Vertex> = new Set();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.c
[class]{}-[func]{dfs}\n[class]{}-[func]{graphDFS}\n
graph_dfs.cs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet)\n{\nres.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nforeach (Vertex adjVet in graph.adjList[vet])\n{\nif (visited.Contains(adjVet))\n{\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9                             \n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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{\n// \u9876\u70b9\u904d\u5386\u5e8f\u5217\nList<Vertex> res = new List<Vertex>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nHashSet<Vertex> visited = new HashSet<Vertex>();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\nres.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adjVet in graph.adjList[vet] ?? [] {\nif visited.contains(adjVet) {\ncontinue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nvar res: [Vertex] = []\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvar visited: Set<Vertex> = []\ndfs(graph: graph, visited: &visited, res: &res, vet: startVet)\nreturn res\n}\n
graph_dfs.zig
[class]{}-[func]{dfs}\n[class]{}-[func]{graphDFS}\n

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5176\u4e2d\uff1a

  • \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\uff1b
  • \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\u9012\u5f52\u65b9\u6cd5\u7684\u4f4d\u7f6e\uff1b

\u4e3a\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8bae\u5c06\u56fe\u793a\u4e0e\u4ee3\u7801\u7ed3\u5408\u8d77\u6765\uff0c\u5728\u8111\u4e2d\uff08\u6216\u8005\u7528\u7b14\u753b\u4e0b\u6765\uff09\u6a21\u62df\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>

\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\u3001\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u3001\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\u4e0d\u540c\u7684\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/#_4","title":"\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\u8868 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":"10.4. \u00a0 \u5c0f\u7ed3","text":"
  • \u56fe\u7531\u9876\u70b9\u548c\u8fb9\u7ec4\u6210\uff0c\u53ef\u4ee5\u88ab\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\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\\) \u6761\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\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\u89d2\u5ea6\u5206\u6790\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff0c\u90bb\u63a5\u8868\u4f53\u73b0\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_hashing/hash_collision/","title":"7.2. \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

\u5728\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570\u5e94\u4e3a\u6bcf\u4e2a\u8f93\u5165\u751f\u6210\u552f\u4e00\u7684\u8f93\u51fa\uff0c\u5b9e\u73b0 key \u548c value \u7684\u4e00\u4e00\u5bf9\u5e94\u3002\u7136\u800c\u5b9e\u9645\u4e0a\uff0c\u5411\u54c8\u5e0c\u51fd\u6570\u8f93\u5165\u4e0d\u540c\u7684 key \u5374\u4ea7\u751f\u76f8\u540c\u8f93\u51fa\u7684\u60c5\u51b5\u662f\u5b58\u5728\u7684\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u300c\u54c8\u5e0c\u51b2\u7a81 Hash Collision\u300d\u3002\u54c8\u5e0c\u51b2\u7a81\u53ef\u80fd\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u9519\u8bef\uff0c\u4ece\u800c\u4e25\u91cd\u5f71\u54cd\u54c8\u5e0c\u8868\u7684\u53ef\u7528\u6027\u3002

\u90a3\u4e48\uff0c\u4e3a\u4f55\u4f1a\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u5462\uff1f\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u7531\u4e8e\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u5165\u7a7a\u95f4\u901a\u5e38\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff0c\u56e0\u6b64\u591a\u4e2a\u8f93\u5165\u4ea7\u751f\u76f8\u540c\u8f93\u51fa\u7684\u60c5\u51b5\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u4f8b\u5982\uff0c\u82e5\u8f93\u5165\u7a7a\u95f4\u4e3a\u5168\u4f53\u6574\u6570\uff0c\u800c\u8f93\u51fa\u7a7a\u95f4\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u6570\u7ec4\uff0c\u5219\u5fc5\u7136\u6709\u591a\u4e2a\u6574\u6570\u6620\u5c04\u81f3\u540c\u4e00\u6570\u7ec4\u7d22\u5f15\u3002

\u4e3a\u4e86\u51cf\u8f7b\u54c8\u5e0c\u51b2\u7a81\uff0c\u4e00\u65b9\u9762\uff0c\u53ef\u4ee5\u901a\u8fc7\u6269\u5927\u54c8\u5e0c\u8868\u5bb9\u91cf\u6765\u964d\u4f4e\u51b2\u7a81\u6982\u7387\u3002\u6781\u7aef\u60c5\u51b5\u4e0b\uff0c\u5f53\u8f93\u5165\u7a7a\u95f4\u548c\u8f93\u51fa\u7a7a\u95f4\u5927\u5c0f\u76f8\u7b49\u65f6\uff0c\u54c8\u5e0c\u8868\u7b49\u540c\u4e8e\u6570\u7ec4\uff0c\u6bcf\u4e2a key \u90fd\u5bf9\u5e94\u552f\u4e00\u7684\u6570\u7ec4\u7d22\u5f15\uff0c\u53ef\u8c13\u201c\u5927\u529b\u51fa\u5947\u8ff9\u201d\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u53ef\u4ee5\u8003\u8651\u4f18\u5316\u54c8\u5e0c\u8868\u7684\u8868\u793a\u4ee5\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\uff0c\u5e38\u7528\u65b9\u6cd5\u5305\u62ec\u300c\u94fe\u5f0f\u5730\u5740 Separate Chaining\u300d\u548c\u300c\u5f00\u653e\u5bfb\u5740 Open Addressing\u300d\u3002

"},{"location":"chapter_hashing/hash_collision/#721","title":"7.2.1. \u00a0 \u54c8\u5e0c\u8868\u6269\u5bb9","text":"

\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u901a\u5e38\u662f\u5bf9\u6876\u6570\u91cf \\(n\\) \u53d6\u4f59\uff0c\u4f5c\u7528\u662f\u5c06\u54c8\u5e0c\u503c\u6620\u5c04\u5230\u6876\u7d22\u5f15\u8303\u56f4\uff0c\u4ece\u800c\u5c06 key \u653e\u5165\u5bf9\u5e94\u7684\u6876\u4e2d\u3002\u5f53\u54c8\u5e0c\u8868\u5bb9\u91cf\u8d8a\u5927\uff08\u5373 \\(n\\) \u8d8a\u5927\uff09\u65f6\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\u5f53\u54c8\u5e0c\u8868\u5185\u7684\u51b2\u7a81\u603b\u4f53\u8f83\u4e3a\u4e25\u91cd\u65f6\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u7f13\u89e3\u51b2\u7a81\u3002\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\u5f00\u9500\u8f83\u5927\u3002

\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f7f\u7528\u300c\u8d1f\u8f7d\u56e0\u5b50 Load Factor\u300d\u6765\u8861\u91cf\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u4e2d\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u5e38\u4f5c\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u89e6\u53d1\u6761\u4ef6\u3002\u5728 Java \u4e2d\uff0c\u5f53\u8d1f\u8f7d\u56e0\u5b50 \\(> 0.75\\) \u65f6\uff0c\u7cfb\u7edf\u4f1a\u5c06 HashMap \u5bb9\u91cf\u6269\u5c55\u4e3a\u539f\u5148\u7684 \\(2\\) \u500d\u3002

"},{"location":"chapter_hashing/hash_collision/#722","title":"7.2.2. \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\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

Fig. \u94fe\u5f0f\u5730\u5740

\u94fe\u5f0f\u5730\u5740\u4e0b\uff0c\u54c8\u5e0c\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u5305\u62ec\uff1a

  • \u67e5\u8be2\u5143\u7d20\uff1a\u8f93\u5165 key \uff0c\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u6570\u7ec4\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\u5148\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u5c06\u8282\u70b9\uff08\u5373\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\uff0c\u5e76\u5c06\u5176\u5220\u9664\u3002

\u5c3d\u7ba1\u94fe\u5f0f\u5730\u5740\u6cd5\u89e3\u51b3\u4e86\u54c8\u5e0c\u51b2\u7a81\u95ee\u9898\uff0c\u4f46\u4ecd\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\uff0c\u5305\u62ec\uff1a

  • \u5360\u7528\u7a7a\u95f4\u589e\u5927\uff0c\u7531\u4e8e\u94fe\u8868\u6216\u4e8c\u53c9\u6811\u5305\u542b\u8282\u70b9\u6307\u9488\uff0c\u76f8\u6bd4\u6570\u7ec4\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\uff1b
  • \u67e5\u8be2\u6548\u7387\u964d\u4f4e\uff0c\u56e0\u4e3a\u9700\u8981\u7ebf\u6027\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\uff1b

\u4e3a\u4e86\u63d0\u9ad8\u64cd\u4f5c\u6548\u7387\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u300cAVL \u6811\u300d\u6216\u300c\u7ea2\u9ed1\u6811\u300d\uff0c\u5c06\u67e5\u8be2\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002

"},{"location":"chapter_hashing/hash_collision/#723","title":"7.2.3. \u00a0 \u5f00\u653e\u5bfb\u5740","text":"

\u300c\u5f00\u653e\u5bfb\u5740\u300d\u65b9\u6cd5\u4e0d\u5f15\u5165\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u800c\u662f\u901a\u8fc7\u201c\u591a\u6b21\u63a2\u6d4b\u201d\u6765\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u63a2\u6d4b\u65b9\u4e3b\u8981\u5305\u62ec\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u3001\u591a\u6b21\u54c8\u5e0c\u3002

"},{"location":"chapter_hashing/hash_collision/#_1","title":"\u7ebf\u6027\u63a2\u6d4b","text":"

\u300c\u7ebf\u6027\u63a2\u6d4b\u300d\u91c7\u7528\u56fa\u5b9a\u6b65\u957f\u7684\u7ebf\u6027\u67e5\u627e\u6765\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u3002

\u63d2\u5165\u5143\u7d20\uff1a\u82e5\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\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\u4f4d\uff0c\u5c06\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002

\u67e5\u627e\u5143\u7d20\uff1a\u5728\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u65f6\uff0c\u4f7f\u7528\u76f8\u540c\u6b65\u957f\u8fdb\u884c\u7ebf\u6027\u67e5\u627e\uff0c\u53ef\u80fd\u9047\u5230\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

  1. \u627e\u5230\u5bf9\u5e94\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b
  2. \u82e5\u9047\u5230\u7a7a\u4f4d\uff0c\u8bf4\u660e\u76ee\u6807\u952e\u503c\u5bf9\u4e0d\u5728\u54c8\u5e0c\u8868\u4e2d\uff1b

Fig. \u7ebf\u6027\u63a2\u6d4b

\u7ebf\u6027\u63a2\u6d4b\u5b58\u5728\u4ee5\u4e0b\u7f3a\u9677\uff1a

  • \u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u3002\u5220\u9664\u5143\u7d20\u4f1a\u5728\u6570\u7ec4\u5185\u4ea7\u751f\u4e00\u4e2a\u7a7a\u4f4d\uff0c\u67e5\u627e\u5176\u4ed6\u5143\u7d20\u65f6\uff0c\u8be5\u7a7a\u4f4d\u53ef\u80fd\u5bfc\u81f4\u7a0b\u5e8f\u8bef\u5224\u5143\u7d20\u4e0d\u5b58\u5728\uff08\u5373\u4e0a\u8ff0\u7b2c 2. \u79cd\u60c5\u51b5\uff09\u3002\u56e0\u6b64\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u6807\u5fd7\u4f4d\u6765\u6807\u8bb0\u5df2\u5220\u9664\u5143\u7d20\u3002
  • \u5bb9\u6613\u4ea7\u751f\u805a\u96c6\u3002\u6570\u7ec4\u5185\u8fde\u7eed\u88ab\u5360\u7528\u4f4d\u7f6e\u8d8a\u957f\uff0c\u8fd9\u4e9b\u8fde\u7eed\u4f4d\u7f6e\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u8fdb\u4e00\u6b65\u4fc3\u4f7f\u8fd9\u4e00\u4f4d\u7f6e\u7684\u201c\u805a\u5806\u751f\u957f\u201d\uff0c\u6700\u7ec8\u5bfc\u81f4\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u964d\u4f4e\u3002
"},{"location":"chapter_hashing/hash_collision/#_2","title":"\u591a\u6b21\u54c8\u5e0c","text":"

\u987e\u540d\u601d\u4e49\uff0c\u300c\u591a\u6b21\u54c8\u5e0c\u300d\u65b9\u6cd5\u662f\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\) , \\(f_2(x)\\) , \\(f_3(x)\\) , \\(\\cdots\\) \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\u5b58\u5728\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\uff1a

  1. \u5982\u679c\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de\u4e4b\uff1b
  2. \u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5c1d\u8bd5\u6240\u6709\u54c8\u5e0c\u51fd\u6570\uff0c\u5219\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u4e0d\u5b58\u5728\u8be5\u5143\u7d20\uff1b

\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\u589e\u52a0\u989d\u5916\u7684\u8ba1\u7b97\u91cf\u3002

\u54c8\u5e0c\u8868\u8bbe\u8ba1\u65b9\u6848

Java \u91c7\u7528\u300c\u94fe\u5f0f\u5730\u5740\u300d\u3002\u81ea JDK 1.8 \u4ee5\u6765\uff0c\u5f53 HashMap \u5185\u6570\u7ec4\u957f\u5ea6\u5927\u4e8e 64 \u4e14\u94fe\u8868\u957f\u5ea6\u5927\u4e8e 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u88ab\u8f6c\u6362\u4e3a\u300c\u7ea2\u9ed1\u6811\u300d\u4ee5\u63d0\u5347\u67e5\u627e\u6027\u80fd\u3002

Python \u91c7\u7528\u300c\u5f00\u653e\u5bfb\u5740\u300d\u3002\u5b57\u5178 dict \u4f7f\u7528\u4f2a\u968f\u673a\u6570\u8fdb\u884c\u63a2\u6d4b\u3002

Golang \u91c7\u7528\u300c\u94fe\u5f0f\u5730\u5740\u300d\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":"7.1. \u00a0 \u54c8\u5e0c\u8868","text":"

\u54c8\u5e0c\u8868\u901a\u8fc7\u5efa\u7acb\u300c\u952e key\u300d\u4e0e\u300c\u503c value\u300d\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\u8f93\u5165\u4e00\u4e2a key\uff0c\u5219\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u5bf9\u5e94\u7684 value \u3002

\u4ee5\u4e00\u4e2a\u5305\u542b \\(n\\) \u4e2a\u5b66\u751f\u7684\u6570\u636e\u5e93\u4e3a\u4f8b\uff0c\u6bcf\u4e2a\u5b66\u751f\u90fd\u6709\u201c\u59d3\u540d name\u201d\u548c\u201c\u5b66\u53f7 id\u201d\u4e24\u9879\u6570\u636e\u3002\u5047\u5982\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u4f8b\u5982\u201c\u8f93\u5165\u4e00\u4e2a\u5b66\u53f7\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u59d3\u540d\u201d\uff0c\u5219\u53ef\u4ee5\u91c7\u7528\u54c8\u5e0c\u8868\u6765\u5b9e\u73b0\u3002

Fig. \u54c8\u5e0c\u8868\u7684\u62bd\u8c61\u8868\u793a

\u9664\u54c8\u5e0c\u8868\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u6216\u94fe\u8868\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u5404\u9879\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5982\u4e0b\u8868\u6240\u793a\u3002

\u5728\u54c8\u5e0c\u8868\u4e2d\u589e\u5220\u67e5\u6539\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u5168\u9762\u80dc\u51fa\uff01\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u5e38\u7528\u4e8e\u5bf9\u67e5\u627e\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u7684\u573a\u666f\u3002

\u6570\u7ec4 \u94fe\u8868 \u54c8\u5e0c\u8868 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_hashing/hash_map/#711","title":"7.1.1. \u00a0 \u54c8\u5e0c\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u54c8\u5e0c\u8868\u7684\u57fa\u672c\u64cd\u4f5c\u5305\u62ec \u521d\u59cb\u5316\u3001\u67e5\u8be2\u64cd\u4f5c\u3001\u6dfb\u52a0\u4e0e\u5220\u9664\u952e\u503c\u5bf9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig hash_map.java
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<Integer, String> map = new HashMap<>();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");   map.put(15937, \"\u5c0f\u5570\");   map.put(16750, \"\u5c0f\u7b97\");   map.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9e2d\");\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
hash_map.cpp
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nunordered_map<int, string> map;\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.erase(10583);\n
hash_map.py
# \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nmapp: Dict = {}\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmapp[12836] = \"\u5c0f\u54c8\"\nmapp[15937] = \"\u5c0f\u5570\"\nmapp[16750] = \"\u5c0f\u7b97\"\nmapp[13276] = \"\u5c0f\u6cd5\"\nmapp[10583] = \"\u5c0f\u9e2d\"\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname: str = mapp[15937]\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmapp.pop(10583)\n
hash_map.go
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nmapp := make(map[int]string)\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmapp[12836] = \"\u5c0f\u54c8\"\nmapp[15937] = \"\u5c0f\u5570\"\nmapp[16750] = \"\u5c0f\u7b97\"\nmapp[13276] = \"\u5c0f\u6cd5\"\nmapp[10583] = \"\u5c0f\u9e2d\"\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname := mapp[15937]\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\ndelete(mapp, 10583)\n
hash_map.js
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new ArrayHashMap();\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\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/* \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.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\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)\nmap.Add(12836, \"\u5c0f\u54c8\");\nmap.Add(15937, \"\u5c0f\u5570\");\nmap.Add(16750, \"\u5c0f\u7b97\");\nmap.Add(13276, \"\u5c0f\u6cd5\");\nmap.Add(10583, \"\u5c0f\u9e2d\");\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.Remove(10583);\n
hash_map.swift
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nvar map: [Int: String] = [:]\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\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.zig
\n

\u904d\u5386\u54c8\u5e0c\u8868\u6709\u4e09\u79cd\u65b9\u5f0f\uff0c\u5373 \u904d\u5386\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u3001\u904d\u5386\u503c\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig hash_map.java
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\nSystem.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (int key: map.keySet()) {\nSystem.out.println(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (String val: map.values()) {\nSystem.out.println(val);\n}\n
hash_map.cpp
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (auto kv: map) {\ncout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (auto key: map) {\ncout << key.first << endl;\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (auto val: map) {\ncout << val.second << endl;\n}\n
hash_map.py
# \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value in mapp.items():\nprint(key, \"->\", value)\n# \u5355\u72ec\u904d\u5386\u952e key\nfor key in mapp.keys():\nprint(key)\n# \u5355\u72ec\u904d\u5386\u503c value\nfor value in mapp.values():\nprint(value)\n
hash_map_test.go
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value := range mapp {\nfmt.Println(key, \"->\", value)\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor key := range mapp {\nfmt.Println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor _, value := range mapp {\nfmt.Println(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()) {\nconsole.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\nconsole.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\nconsole.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()) {\nconsole.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\nconsole.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\nconsole.info(v);\n}\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
hash_map.cs
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nforeach (var kv in map)\n{\nConsole.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nforeach (int key in map.Keys)\n{\nConsole.WriteLine(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nforeach (String val in map.Values)\n{\nConsole.WriteLine(val);\n}\n
hash_map.swift
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in map {\nprint(\"\\(key) -> \\(value)\")\n}\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys {\nprint(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values {\nprint(value)\n}\n
hash_map.zig
\n
"},{"location":"chapter_hashing/hash_map/#712","title":"7.1.2. \u00a0 \u54c8\u5e0c\u51fd\u6570","text":"

\u54c8\u5e0c\u8868\u7684\u5e95\u5c42\u5b9e\u73b0\u4e3a\u6570\u7ec4\uff0c\u540c\u65f6\u53ef\u80fd\u5305\u542b\u94fe\u8868\u3001\u4e8c\u53c9\u6811\uff08\u7ea2\u9ed1\u6811\uff09\u7b49\u6570\u636e\u7ed3\u6784\uff0c\u4ee5\u63d0\u9ad8\u67e5\u8be2\u6027\u80fd\uff08\u5c06\u5728\u4e0b\u8282\u8ba8\u8bba\uff09\u3002

\u9996\u5148\u8003\u8651\u6700\u7b80\u5355\u7684\u60c5\u51b5\uff0c\u4ec5\u4f7f\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u5b9e\u73b0\u54c8\u5e0c\u8868\u3002\u901a\u5e38\uff0c\u6211\u4eec\u5c06\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u7a7a\u4f4d\u79f0\u4e3a\u300c\u6876 Bucket\u300d\uff0c\u7528\u4e8e\u5b58\u50a8\u952e\u503c\u5bf9\u3002

\u6211\u4eec\u5c06\u952e\u503c\u5bf9 key, value \u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b Entry \uff0c\u5e76\u5c06\u6240\u6709 Entry \u653e\u5165\u6570\u7ec4\u4e2d\u3002\u8fd9\u6837\uff0c\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a Entry \u90fd\u5177\u6709\u552f\u4e00\u7684\u7d22\u5f15\u3002\u4e3a\u4e86\u5efa\u7acb key \u548c\u7d22\u5f15\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528\u300c\u54c8\u5e0c\u51fd\u6570 Hash Function\u300d\u3002

\u8bbe\u54c8\u5e0c\u8868\u7684\u6570\u7ec4\u4e3a buckets \uff0c\u54c8\u5e0c\u51fd\u6570\u4e3a f(x) \uff0c\u90a3\u4e48\u67e5\u8be2\u64cd\u4f5c\u7684\u6b65\u9aa4\u5982\u4e0b\uff1a

  1. \u8f93\u5165 key \uff0c\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u51fa\u7d22\u5f15 index \uff0c\u5373 index = f(key) \uff1b
  2. \u901a\u8fc7\u7d22\u5f15\u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5230\u952e\u503c\u5bf9 entry \uff0c\u5373 entry = buckets[index] \uff0c\u7136\u540e\u4ece entry \u4e2d\u83b7\u53d6\u5bf9\u5e94\u7684 value \uff1b

\u4ee5\u5b66\u751f\u6570\u636e key \u5b66\u53f7 -> value \u59d3\u540d \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8bbe\u8ba1\u5982\u4e0b\u54c8\u5e0c\u51fd\u6570\uff1a

\\[ f(x) = x \\% 100 \\]

Fig. \u54c8\u5e0c\u51fd\u6570\u5de5\u4f5c\u539f\u7406

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_hash_map.java
/* \u952e\u503c\u5bf9 int->String */\nclass Entry {\npublic int key;\npublic String val;\npublic Entry(int key, String val) {\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate List<Entry> buckets;\npublic ArrayHashMap() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets = new ArrayList<>();\nfor (int i = 0; i < 100; i++) {\nbuckets.add(null);\n}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate int hashFunc(int key) {\nint index = key % 100;\nreturn index;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\npublic String get(int key) {\nint index = hashFunc(key);\nEntry pair = buckets.get(index);\nif (pair == null)\nreturn null;\nreturn pair.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\npublic void put(int key, String val) {\nEntry pair = new Entry(key, val);\nint index = hashFunc(key);\nbuckets.set(index, pair);\n}\n/* \u5220\u9664\u64cd\u4f5c */\npublic void remove(int key) {\nint index = hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nbuckets.set(index, null);\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic List<Entry> entrySet() {\nList<Entry> entrySet = new ArrayList<>();\nfor (Entry pair : buckets) {\nif (pair != null)\nentrySet.add(pair);\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic List<Integer> keySet() {\nList<Integer> keySet = new ArrayList<>();\nfor (Entry pair : buckets) {\nif (pair != null)\nkeySet.add(pair.key);\n}\nreturn keySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\npublic List<String> valueSet() {\nList<String> valueSet = new ArrayList<>();\nfor (Entry pair : buckets) {\nif (pair != null)\nvalueSet.add(pair.val);\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic void print() {\nfor (Entry kv : entrySet()) {\nSystem.out.println(kv.key + \" -> \" + kv.val);\n}\n}\n}\n
array_hash_map.cpp
/* \u952e\u503c\u5bf9 int->String */\nstruct Entry {\npublic:\nint key;\nstring val;\nEntry(int key, string val) {\nthis->key = key;\nthis->val = val;\n}\n};\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate:\nvector<Entry *> buckets;\npublic:\nArrayHashMap() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets = vector<Entry *>(100);\n}\n~ArrayHashMap() {\n// \u91ca\u653e\u5185\u5b58\nfor (const auto &bucket : buckets) {\ndelete bucket;\n}\nbuckets.clear();\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(int key) {\nint index = key % 100;\nreturn index;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nstring get(int key) {\nint index = hashFunc(key);\nEntry *pair = buckets[index];\nif (pair == nullptr)\nreturn nullptr;\nreturn pair->val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(int key, string val) {\nEntry *pair = new Entry(key, val);\nint index = hashFunc(key);\nbuckets[index] = pair;\n}\n/* \u5220\u9664\u64cd\u4f5c */\nvoid remove(int key) {\nint index = hashFunc(key);\n// \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\ndelete buckets[index];\nbuckets[index] = nullptr;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvector<Entry *> entrySet() {\nvector<Entry *> entrySet;\nfor (Entry *pair : buckets) {\nif (pair != nullptr) {\nentrySet.push_back(pair);\n}\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvector<int> keySet() {\nvector<int> keySet;\nfor (Entry *pair : buckets) {\nif (pair != nullptr) {\nkeySet.push_back(pair->key);\n}\n}\nreturn keySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvector<string> valueSet() {\nvector<string> valueSet;\nfor (Entry *pair : buckets) {\nif (pair != nullptr) {\nvalueSet.push_back(pair->val);\n}\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print() {\nfor (Entry *kv : entrySet()) {\ncout << kv->key << \" -> \" << kv->val << endl;\n}\n}\n};\n
array_hash_map.py
class Entry:\n\"\"\"\u952e\u503c\u5bf9 int->String\"\"\"\ndef __init__(self, key: int, val: str):\nself.key = key\nself.val = val\nclass ArrayHashMap:\n\"\"\"\u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n# \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nself.buckets: list[Entry | None] = [None] * 100\ndef hash_func(self, key: int) -> int:\n\"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\nindex: int = key % 100\nreturn index\ndef get(self, key: int) -> str:\n\"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\nindex: int = self.hash_func(key)\npair: Entry = self.buckets[index]\nif pair is None:\nreturn None\nreturn pair.val\ndef put(self, key: int, val: str) -> None:\n\"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\npair = Entry(key, val)\nindex: int = self.hash_func(key)\nself.buckets[index] = pair\ndef remove(self, key: int) -> None:\n\"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\nindex: int = self.hash_func(key)\n# \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\nself.buckets[index] = None\ndef entry_set(self) -> list[Entry]:\n\"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\nresult: list[Entry] = []\nfor pair in self.buckets:\nif pair is not None:\nresult.append(pair)\nreturn result\ndef key_set(self) -> list[int]:\n\"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\nresult: list[int] = []\nfor pair in self.buckets:\nif pair is not None:\nresult.append(pair.key)\nreturn result\ndef value_set(self) -> list[str]:\n\"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\nresult: list[str] = []\nfor pair in self.buckets:\nif pair is not None:\nresult.append(pair.val)\nreturn result\ndef print(self) -> None:\n\"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\nfor pair in self.buckets:\nif pair is not None:\nprint(pair.key, \"->\", pair.val)\n
array_hash_map.go
/* \u952e\u503c\u5bf9 int->String */\ntype entry struct {\nkey int\nval string\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\nbuckets []*entry\n}\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets := make([]*entry, 100)\nreturn &arrayHashMap{buckets: buckets}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\nindex := key % 100\nreturn index\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\nindex := a.hashFunc(key)\npair := a.buckets[index]\nif pair == nil {\nreturn \"Not Found\"\n}\nreturn pair.val\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\npair := &entry{key: key, val: val}\nindex := a.hashFunc(key)\na.buckets[index] = pair\n}\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\nindex := a.hashFunc(key)\n// \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\na.buckets[index] = nil\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) entrySet() []*entry {\nvar pairs []*entry\nfor _, pair := range a.buckets {\nif pair != nil {\npairs = append(pairs, pair)\n}\n}\nreturn pairs\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\nvar keys []int\nfor _, pair := range a.buckets {\nif pair != nil {\nkeys = append(keys, pair.key)\n}\n}\nreturn keys\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\nvar values []string\nfor _, pair := range a.buckets {\nif pair != nil {\nvalues = append(values, pair.val)\n}\n}\nreturn values\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\nfor _, pair := range a.buckets {\nif pair != nil {\nfmt.Println(pair.key, \"->\", pair.val)\n}\n}\n}\n
array_hash_map.js
/* \u952e\u503c\u5bf9 Number -> String */\nclass Entry {\nconstructor(key, val) {\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n#buckets;\nconstructor() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nthis.#buckets = new Array(100).fill(null);\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\n#hashFunc(key) {\nreturn key % 100;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nget(key) {\nlet index = this.#hashFunc(key);\nlet entry = this.#buckets[index];\nif (entry === null) return null;\nreturn entry.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nset(key, val) {\nlet index = this.#hashFunc(key);\nthis.#buckets[index] = new Entry(key, val);\n}\n/* \u5220\u9664\u64cd\u4f5c */\ndelete(key) {\nlet index = this.#hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nthis.#buckets[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nentries() {\nlet arr = [];\nfor (let i = 0; i < this.#buckets.length; i++) {\nif (this.#buckets[i]) {\narr.push(this.#buckets[i]);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nkeys() {\nlet arr = [];\nfor (let i = 0; i < this.#buckets.length; i++) {\nif (this.#buckets[i]) {\narr.push(this.#buckets[i]?.key);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvalues() {\nlet arr = [];\nfor (let i = 0; i < this.#buckets.length; i++) {\nif (this.#buckets[i]) {\narr.push(this.#buckets[i]?.val);\n}\n}\nreturn arr;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nprint() {\nlet entrySet = this.entries();\nfor (const entry of entrySet) {\nif (!entry) continue;\nconsole.info(`${entry.key} -> ${entry.val}`);\n}\n}\n}\n
array_hash_map.ts
/* \u952e\u503c\u5bf9 Number -> String */\nclass Entry {\npublic key: number;\npublic val: string;\nconstructor(key: number, val: string) {\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate readonly buckets: (Entry | null)[];\nconstructor() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nthis.buckets = new Array(100).fill(null);\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate hashFunc(key: number): number {\nreturn key % 100;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\npublic get(key: number): string | null {\nlet index = this.hashFunc(key);\nlet entry = this.buckets[index];\nif (entry === null) return null;\nreturn entry.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\npublic set(key: number, val: string) {\nlet index = this.hashFunc(key);\nthis.buckets[index] = new Entry(key, val);\n}\n/* \u5220\u9664\u64cd\u4f5c */\npublic delete(key: number) {\nlet index = this.hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nthis.buckets[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic entries(): (Entry | null)[] {\nlet arr: (Entry | null)[] = [];\nfor (let i = 0; i < this.buckets.length; i++) {\nif (this.buckets[i]) {\narr.push(this.buckets[i]);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic keys(): (number | undefined)[] {\nlet arr: (number | undefined)[] = [];\nfor (let i = 0; i < this.buckets.length; i++) {\nif (this.buckets[i]) {\narr.push(this.buckets[i]?.key);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\npublic values(): (string | undefined)[] {\nlet arr: (string | undefined)[] = [];\nfor (let i = 0; i < this.buckets.length; i++) {\nif (this.buckets[i]) {\narr.push(this.buckets[i]?.val);\n}\n}\nreturn arr;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic print() {\nlet entrySet = this.entries();\nfor (const entry of entrySet) {\nif (!entry) continue;\nconsole.info(`${entry.key} -> ${entry.val}`);\n}\n}\n}\n
array_hash_map.c
[class]{entry}-[func]{}\n[class]{arrayHashMap}-[func]{}\n
array_hash_map.cs
/* \u952e\u503c\u5bf9 int->String */\nclass Entry\n{\npublic int key;\npublic String val;\npublic Entry(int key, String val)\n{\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap\n{\nprivate List<Entry?> buckets;\npublic ArrayHashMap()\n{\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets = new();\nfor (int i = 0; i < 100; i++)\n{\nbuckets.Add(null);\n}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate int hashFunc(int key)\n{\nint index = key % 100;\nreturn index;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\npublic String? get(int key)\n{\nint index = hashFunc(key);\nEntry? pair = buckets[index];\nif (pair == null) return null;\nreturn pair.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\npublic void put(int key, String val)\n{\nEntry pair = new Entry(key, val);\nint index = hashFunc(key);\nbuckets[index] = pair;\n}\n/* \u5220\u9664\u64cd\u4f5c */\npublic void remove(int key)\n{\nint index = hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nbuckets[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic List<Entry> entrySet()\n{\nList<Entry> entrySet = new();\nforeach (Entry? pair in buckets)\n{\nif (pair != null)\nentrySet.Add(pair);\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic List<int> keySet()\n{\nList<int> keySet = new();\nforeach (Entry? pair in buckets)\n{\nif (pair != null)\nkeySet.Add(pair.key);\n}\nreturn keySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\npublic List<String> valueSet()\n{\nList<String> valueSet = new();\nforeach (Entry? pair in buckets)\n{\nif (pair != null)\nvalueSet.Add(pair.val);\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic void print()\n{\nforeach (Entry kv in entrySet())\n{\nConsole.WriteLine(kv.key + \" -> \" + kv.val);\n}\n}\n}\n
array_hash_map.swift
/* \u952e\u503c\u5bf9 int->String */\nclass Entry {\nvar key: Int\nvar val: String\ninit(key: Int, val: String) {\nself.key = key\nself.val = val\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate var buckets: [Entry?] = []\ninit() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nfor _ in 0 ..< 100 {\nbuckets.append(nil)\n}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate func hashFunc(key: Int) -> Int {\nlet index = key % 100\nreturn index\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc get(key: Int) -> String? {\nlet index = hashFunc(key: key)\nlet pair = buckets[index]\nreturn pair?.val\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc put(key: Int, val: String) {\nlet pair = Entry(key: key, val: val)\nlet index = hashFunc(key: key)\nbuckets[index] = pair\n}\n/* \u5220\u9664\u64cd\u4f5c */\nfunc remove(key: Int) {\nlet index = hashFunc(key: key)\n// \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\nbuckets[index] = nil\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nfunc entrySet() -> [Entry] {\nvar entrySet: [Entry] = []\nfor pair in buckets {\nif let pair = pair {\nentrySet.append(pair)\n}\n}\nreturn entrySet\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc keySet() -> [Int] {\nvar keySet: [Int] = []\nfor pair in buckets {\nif let pair = pair {\nkeySet.append(pair.key)\n}\n}\nreturn keySet\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc valueSet() -> [String] {\nvar valueSet: [String] = []\nfor pair in buckets {\nif let pair = pair {\nvalueSet.append(pair.val)\n}\n}\nreturn valueSet\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc print() {\nfor entry in entrySet() {\nSwift.print(\"\\(entry.key) -> \\(entry.val)\")\n}\n}\n}\n
array_hash_map.zig
// \u952e\u503c\u5bf9 int->String\nconst Entry = struct {\nkey: usize = undefined,\nval: []const u8 = undefined,\npub fn init(key: usize, val: []const u8) Entry {\nreturn Entry {\n.key = key,\n.val = val,\n};\n}\n};\n// \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\nreturn struct {\nbuckets: ?std.ArrayList(?T) = null,\nmem_allocator: std.mem.Allocator = undefined,\nconst Self = @This();\n// \u6784\u9020\u65b9\u6cd5\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nself.mem_allocator = allocator;\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nself.buckets = std.ArrayList(?T).init(self.mem_allocator);\nvar i: i32 = 0;\nwhile (i < 100) : (i += 1) {\ntry self.buckets.?.append(null);\n}\n}\n// \u6790\u6784\u65b9\u6cd5\npub fn deinit(self: *Self) void {\nif (self.buckets != null) self.buckets.?.deinit();\n}\n// \u54c8\u5e0c\u51fd\u6570\nfn hashFunc(key: usize) usize {\nvar index = key % 100;\nreturn index;\n}\n// \u67e5\u8be2\u64cd\u4f5c\npub fn get(self: *Self, key: usize) []const u8 {\nvar index = hashFunc(key);\nvar pair = self.buckets.?.items[index];\nreturn pair.?.val;\n}\n// \u6dfb\u52a0\u64cd\u4f5c\npub fn put(self: *Self, key: usize, val: []const u8) !void {\nvar pair = Entry.init(key, val);\nvar index = hashFunc(key);\nself.buckets.?.items[index] = pair;\n}\n// \u5220\u9664\u64cd\u4f5c\npub fn remove(self: *Self, key: usize) !void {\nvar index = hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nself.buckets.?.items[index] = null;\n}       // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\npub fn entrySet(self: *Self) !*std.ArrayList(T) {\nvar entry_set = std.ArrayList(T).init(self.mem_allocator);\nfor (self.buckets.?.items) |item| {\nif (item == null) continue;\ntry entry_set.append(item.?);\n}\nreturn &entry_set;\n}  // \u83b7\u53d6\u6240\u6709\u952e\npub fn keySet(self: *Self) !*std.ArrayList(usize) {\nvar key_set = std.ArrayList(usize).init(self.mem_allocator);\nfor (self.buckets.?.items) |item| {\nif (item == null) continue;\ntry key_set.append(item.?.key);\n}\nreturn &key_set;\n}  // \u83b7\u53d6\u6240\u6709\u503c\npub fn valueSet(self: *Self) !*std.ArrayList([]const u8) {\nvar value_set = std.ArrayList([]const u8).init(self.mem_allocator);\nfor (self.buckets.?.items) |item| {\nif (item == null) continue;\ntry value_set.append(item.?.val);\n}\nreturn &value_set;\n}\n// \u6253\u5370\u54c8\u5e0c\u8868\npub fn print(self: *Self) !void {\nvar entry_set = try self.entrySet();\ndefer entry_set.deinit();\nfor (entry_set.items) |item| {\nstd.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n}\n}\n};\n}\n
"},{"location":"chapter_hashing/hash_map/#713","title":"7.1.3. \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u5df2\u7ecf\u6ce8\u610f\u5230\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570 \\(f(x) = x % 100\\) \u53ef\u80fd\u65e0\u6cd5\u6b63\u5e38\u5de5\u4f5c\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5f53\u8f93\u5165\u7684 key \u540e\u4e24\u4f4d\u76f8\u540c\u65f6\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u7ed3\u679c\u4e5f\u4f1a\u76f8\u540c\uff0c\u4ece\u800c\u6307\u5411\u540c\u4e00\u4e2a value \u3002\u4f8b\u5982\uff0c\u67e5\u8be2\u5b66\u53f7\u4e3a \\(12836\\) \u548c \\(20336\\) \u7684\u4e24\u4e2a\u5b66\u751f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\uff1a

\\[ f(12836) = f(20336) = 36 \\]

\u8fd9\u4e24\u4e2a\u5b66\u53f7\u6307\u5411\u4e86\u540c\u4e00\u4e2a\u59d3\u540d\uff0c\u8fd9\u663e\u7136\u662f\u9519\u8bef\u7684\u3002\u6211\u4eec\u628a\u8fd9\u79cd\u60c5\u51b5\u79f0\u4e3a\u300c\u54c8\u5e0c\u51b2\u7a81 Hash Collision\u300d\u3002\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u8ba8\u8bba\u5982\u4f55\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u7684\u95ee\u9898\u3002

Fig. \u54c8\u5e0c\u51b2\u7a81\u793a\u4f8b

\u7efc\u4e0a\u6240\u8ff0\uff0c\u4e00\u4e2a\u4f18\u79c0\u7684\u54c8\u5e0c\u51fd\u6570\u5e94\u5177\u5907\u4ee5\u4e0b\u7279\u6027\uff1a

  • \u5c3d\u53ef\u80fd\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\uff1b
  • \u67e5\u8be2\u6548\u7387\u9ad8\u4e14\u7a33\u5b9a\uff0c\u80fd\u591f\u5728\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\u8fbe\u5230 \\(O(1)\\) \u65f6\u95f4\u590d\u6742\u5ea6\uff1b
  • \u8f83\u9ad8\u7684\u7a7a\u95f4\u5229\u7528\u7387\uff0c\u5373\u4f7f\u201c\u952e\u503c\u5bf9\u5360\u7528\u7a7a\u95f4 / \u54c8\u5e0c\u8868\u603b\u5360\u7528\u7a7a\u95f4\u201d\u6bd4\u4f8b\u6700\u5927\u5316\uff1b
"},{"location":"chapter_hashing/summary/","title":"7.3. \u00a0 \u5c0f\u7ed3","text":"
  • \u54c8\u5e0c\u8868\u80fd\u591f\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u5c06\u952e key \u6620\u5c04\u5230\u503c value\uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
  • \u5e38\u89c1\u7684\u54c8\u5e0c\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8be2\u3001\u6dfb\u52a0\u4e0e\u5220\u9664\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u503c\u5bf9\u7b49\u3002
  • \u54c8\u5e0c\u51fd\u6570\u5c06 key \u6620\u5c04\u4e3a\u6570\u7ec4\u7d22\u5f15\uff08\u6876\uff09\uff0c\u4ee5\u4fbf\u8bbf\u95ee\u5bf9\u5e94\u7684\u503c value \u3002
  • \u4e24\u4e2a\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u540e\u5f97\u5230\u76f8\u540c\u7684\u7d22\u5f15\uff0c\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u51fa\u9519\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\u3002
  • \u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\u7684\u65b9\u6cd5\u4e3b\u8981\u6709\u6269\u5bb9\u54c8\u5e0c\u8868\u548c\u4f18\u5316\u54c8\u5e0c\u8868\u7684\u8868\u793a\u65b9\u6cd5\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\u4e0e\u6570\u7ec4\u6269\u5bb9\u7c7b\u4f3c\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u64cd\u4f5c\u4e5f\u4f1a\u4ea7\u751f\u8f83\u5927\u7684\u5f00\u9500\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\uff0c\u4ece\u800c\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u3002\u7136\u800c\uff0c\u8fc7\u957f\u7684\u94fe\u8868\u4f1a\u964d\u4f4e\u67e5\u8be2\u6548\u7387\uff0c\u53ef\u4ee5\u901a\u8fc7\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a AVL \u6811\u6216\u7ea2\u9ed1\u6811\u6765\u6539\u5584\u3002
  • \u5f00\u653e\u5bfb\u5740\u901a\u8fc7\u591a\u6b21\u63a2\u6d4b\u6765\u89e3\u51b3\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\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\u5bf9\u7ebf\u6027\u63a2\u6d4b\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\u7b56\u7565\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u94fe\u5f0f\u5730\u5740\uff0c\u800c Python \u7684 Dict \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002
"},{"location":"chapter_heap/build_heap/","title":"9.2. \u00a0 \u5efa\u5806\u64cd\u4f5c *","text":"

\u5982\u679c\u6211\u4eec\u60f3\u8981\u6839\u636e\u8f93\u5165\u5217\u8868\u751f\u6210\u4e00\u4e2a\u5806\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u88ab\u79f0\u4e3a\u300c\u5efa\u5806\u300d\u3002

"},{"location":"chapter_heap/build_heap/#921","title":"9.2.1. \u00a0 \u501f\u52a9\u5165\u5806\u65b9\u6cd5\u5b9e\u73b0","text":"

\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u501f\u52a9\u201c\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\uff0c\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u7a7a\u5806\uff0c\u7136\u540e\u5c06\u5217\u8868\u5143\u7d20\u4f9d\u6b21\u6dfb\u52a0\u5230\u5806\u4e2d\u3002

\u8bbe\u5143\u7d20\u6570\u91cf\u4e3a \\(n\\) \uff0c\u5219\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u5165\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u5728\u4f9d\u6b21\u6dfb\u52a0\u5143\u7d20\u65f6\uff0c\u5806\u7684\u5e73\u5747\u957f\u5ea6\u4e3a \\(\\frac{n}{2}\\) \uff0c\u56e0\u6b64\u8be5\u65b9\u6cd5\u7684\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

"},{"location":"chapter_heap/build_heap/#922","title":"9.2.2. \u00a0 \u57fa\u4e8e\u5806\u5316\u64cd\u4f5c\u5b9e\u73b0","text":"

\u6709\u8da3\u7684\u662f\uff0c\u5b58\u5728\u4e00\u79cd\u66f4\u9ad8\u6548\u7684\u5efa\u5806\u65b9\u6cd5\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u4ec5\u4e3a \\(O(n)\\) \u3002\u6211\u4eec\u5148\u5c06\u5217\u8868\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u5230\u5806\u4e2d\uff0c\u7136\u540e\u8fed\u4ee3\u5730\u5bf9\u5404\u4e2a\u8282\u70b9\u6267\u884c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u3002\u5f53\u7136\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u5bf9\u53f6\u8282\u70b9\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5b83\u4eec\u6ca1\u6709\u5b50\u8282\u70b9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nmaxHeap = new ArrayList<>(nums);\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = parent(size() - 1); i >= 0; i--) {\nsiftDown(i);\n}\n}\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\nmaxHeap = nums;\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = parent(size() - 1); i >= 0; i--) {\nsiftDown(i);\n}\n}\n
my_heap.py
def __init__(self, nums: list[int]):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n# \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\nself.max_heap = nums\n# \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in range(self.parent(self.size() - 1), -1, -1):\nself.sift_down(i)\n
my_heap.go
/* \u6784\u9020\u65b9\u6cd5\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\nh := &maxHeap{data: nums}\nfor i := len(h.data) - 1; i >= 0; i-- {\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nh.siftDown(i)\n}\nreturn h\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\nthis.#maxHeap = nums === undefined ? [] : [...nums];\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (let i = this.#parent(this.size() - 1); i >= 0; i--) {\nthis.#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\nthis.maxHeap = nums === undefined ? [] : [...nums];\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (let i = this.parent(this.size() - 1); i >= 0; i--) {\nthis.siftDown(i);\n}\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\nmaxHeap *h = (maxHeap *)malloc(sizeof(maxHeap));\nh->size = size;\nmemcpy(h->data, nums, size * sizeof(int));\nfor (int i = size - 1; i >= 0; i--) {\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nsiftDown(h, i);\n}\nreturn h;\n}\n
my_heap.cs
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums)\n{\n// \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\nmaxHeap = new List<int>(nums);\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nvar size = parent(this.size() - 1);\nfor (int i = size; i >= 0; i--)\n{\nsiftDown(i);\n}\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\nmaxHeap = nums\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in stride(from: parent(i: size() - 1), through: 0, by: -1) {\nsiftDown(i: i)\n}\n}\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 {\nif (self.max_heap != null) return;\nself.max_heap = std.ArrayList(T).init(allocator);\n// \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\ntry self.max_heap.?.appendSlice(nums);\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nvar i: usize = parent(self.size() - 1) + 1;\nwhile (i > 0) : (i -= 1) {\ntry self.siftDown(i - 1);\n}\n}\n
"},{"location":"chapter_heap/build_heap/#923","title":"9.2.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u4e3a\u4ec0\u4e48\u7b2c\u4e8c\u79cd\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \uff1f\u6211\u4eec\u6765\u5c55\u5f00\u63a8\u7b97\u4e00\u4e0b\u3002

  • \u5b8c\u5168\u4e8c\u53c9\u6811\u4e2d\uff0c\u8bbe\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \uff0c\u5219\u53f6\u8282\u70b9\u6570\u91cf\u4e3a \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u4e3a\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\uff0c\u5728\u6392\u9664\u53f6\u8282\u70b9\u540e\uff0c\u9700\u8981\u5806\u5316\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\((n - 1)/2\\) \uff0c\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b
  • \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 \\(O(\\log n)\\) \uff1b

\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\u7136\u800c\uff0c\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\u7279\u6027\u3002

\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8fdb\u884c\u66f4\u4e3a\u8be6\u7ec6\u7684\u8ba1\u7b97\u3002\u4e3a\u4e86\u51cf\u5c0f\u8ba1\u7b97\u96be\u5ea6\uff0c\u6211\u4eec\u5047\u8bbe\u6811\u662f\u4e00\u4e2a\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff0c\u8be5\u5047\u8bbe\u4e0d\u4f1a\u5f71\u54cd\u8ba1\u7b97\u7ed3\u679c\u7684\u6b63\u786e\u6027\u3002\u8bbe\u4e8c\u53c9\u6811\uff08\u5373\u5806\uff09\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u6811\u9ad8\u5ea6\u4e3a \\(h\\) \u3002\u4e0a\u6587\u63d0\u5230\uff0c\u8282\u70b9\u5806\u5316\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

Fig. \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u5404\u5c42\u8282\u70b9\u6570\u91cf

\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5404\u5c42\u7684\u201c\u8282\u70b9\u6570\u91cf \\(\\times\\) \u8282\u70b9\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u4ece\u800c\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) + \\cdots + 2^{(h-1)}\\times1 \\]

\u5316\u7b80\u4e0a\u5f0f\u9700\u8981\u501f\u52a9\u4e2d\u5b66\u7684\u6570\u5217\u77e5\u8bc6\uff0c\u5148\u5bf9 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230

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

\u4f7f\u7528\u9519\u4f4d\u76f8\u51cf\u6cd5\uff0c\u4ee4\u4e0b\u5f0f \\(2 T(h)\\) \u51cf\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\cdots + 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

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

\u8fdb\u4e00\u6b65\u5730\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":"9.1. \u00a0 \u5806","text":"

\u300c\u5806 Heap\u300d\u662f\u4e00\u79cd\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u53ef\u5206\u4e3a\u4e24\u79cd\u7c7b\u578b\uff1a

  • \u300c\u5927\u9876\u5806 Max Heap\u300d\uff0c\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\geq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\uff1b
  • \u300c\u5c0f\u9876\u5806 Min Heap\u300d\uff0c\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\leq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\uff1b

Fig. \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\uff1a

  • \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\u300c\u5806\u9876\u300d\uff0c\u5c06\u5e95\u5c42\u6700\u9760\u53f3\u7684\u8282\u70b9\u79f0\u4e3a\u300c\u5806\u5e95\u300d\u3002
  • \u5bf9\u4e8e\u5927\u9876\u5806\uff08\u5c0f\u9876\u5806\uff09\uff0c\u5806\u9876\u5143\u7d20\uff08\u5373\u6839\u8282\u70b9\uff09\u7684\u503c\u5206\u522b\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
"},{"location":"chapter_heap/heap/#911","title":"9.1.1. \u00a0 \u5806\u5e38\u7528\u64cd\u4f5c","text":"

\u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u662f\u300c\u4f18\u5148\u961f\u5217 Priority Queue\u300d\uff0c\u8fd9\u662f\u4e00\u79cd\u62bd\u8c61\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\u4f5c\u5b9e\u73b0\u4f18\u5148\u961f\u5217\uff0c\u5927\u9876\u5806\u76f8\u5f53\u4e8e\u5143\u7d20\u6309\u4ece\u5927\u5230\u5c0f\u987a\u5e8f\u51fa\u961f\u7684\u4f18\u5148\u961f\u5217\u3002\u4ece\u4f7f\u7528\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u300c\u4f18\u5148\u961f\u5217\u300d\u548c\u300c\u5806\u300d\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\u4f7f\u7528\u300c\u5806\u300d\u6765\u547d\u540d\u3002

\u5806\u7684\u5e38\u7528\u64cd\u4f5c\u89c1\u4e0b\u8868\uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

\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\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

Tip

\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\u4fee\u6539 Comparator \u6765\u5b9e\u73b0\u201c\u5c0f\u9876\u5806\u201d\u4e0e\u201c\u5927\u9876\u5806\u201d\u4e4b\u95f4\u7684\u8f6c\u6362\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\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 = heap.poll();  // 5\npeek = heap.poll();  // 4\npeek = heap.poll();  // 3\npeek = heap.poll();  // 2\npeek = heap.poll();  // 1\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\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/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\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/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\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.py
# \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\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# \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# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\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# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: List[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\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// 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// 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\nlast := (*h)[len(*h)-1]\n*h = (*h)[:len(*h)-1]\nreturn last\n}\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\nreturn len(*h)\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\nreturn (*h)[i].(int) > (*h)[j].(int)\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// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\nreturn (*h)[0]\n}\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nmaxHeap := &intHeap{}\nheap.Init(maxHeap)\n/* \u5143\u7d20\u5165\u5806 */\n// \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\nheap.Push(maxHeap, 1)\nheap.Push(maxHeap, 3)\nheap.Push(maxHeap, 2)\nheap.Push(maxHeap, 4)\nheap.Push(maxHeap, 5)\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\ntop := maxHeap.Top()\nfmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\nheap.Pop(maxHeap) // 5\nheap.Pop(maxHeap) // 4\nheap.Pop(maxHeap) // 3\nheap.Pop(maxHeap) // 2\nheap.Pop(maxHeap) // 1\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nsize := len(*maxHeap)\nfmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(*maxHeap) == 0\nfmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.cs
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new PriorityQueue<int, int>();\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 PriorityQueue<int, int>(Comparer<int>.Create((x, y) => y - x));\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/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\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/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>(new List<(int, int)> { (1, 1), (3, 3), (2, 2), (5, 5), (4, 4), });\n
heap.swift
// Swift \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.zig
\n
"},{"location":"chapter_heap/heap/#912","title":"9.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\u53d6\u9006\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":"\u5806\u7684\u5b58\u50a8\u4e0e\u8868\u793a","text":"

\u6211\u4eec\u5728\u4e8c\u53c9\u6811\u7ae0\u8282\u4e2d\u5b66\u4e60\u5230\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\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

\u5177\u4f53\u800c\u8a00\uff0c\u7ed9\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 2\\) \uff0c\u7236\u8282\u70b9\u7d22\u5f15\u4e3a \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u53d6\u6574\uff09\u3002\u5f53\u7d22\u5f15\u8d8a\u754c\u65f6\uff0c\u8868\u793a\u7a7a\u8282\u70b9\u6216\u8282\u70b9\u4e0d\u5b58\u5728\u3002

Fig. \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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(int i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(int i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(int i) {\nreturn (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cpp
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(int i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(int i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(int i) {\nreturn (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.py
def left(self, i: int) -> int:\n\"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\"\"\"\nreturn 2 * i + 1\ndef right(self, i: int) -> int:\n\"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\"\"\"\nreturn 2 * i + 2\ndef parent(self, i: int) -> int:\n\"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15\"\"\"\nreturn (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.go
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\nreturn 2*i + 1\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\nreturn 2*i + 2\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n// \u5411\u4e0b\u6574\u9664\nreturn (i - 1) / 2\n}\n
my_heap.js
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\n#left(i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\n#right(i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\n#parent(i) {\nreturn Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nleft(i: number): number {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nright(i: number): number {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nparent(i: number): number {\nreturn Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(maxHeap *h, int i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(maxHeap *h, int i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(maxHeap *h, int i) {\nreturn (i - 1) / 2;\n}\n
my_heap.cs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(int i)\n{\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(int i)\n{\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(int i)\n{\nreturn (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.swift
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n2 * i + 1\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n2 * i + 2\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n(i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.zig
// \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\nfn left(i: usize) usize {\nreturn 2 * i + 1;\n}\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\nfn right(i: usize) usize {\nreturn 2 * i + 2;\n}\n// \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15\nfn parent(i: usize) usize {\n// return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\nreturn @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#_2","title":"\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\nreturn maxHeap.get(0);\n}\n
my_heap.cpp
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\nreturn maxHeap[0];\n}\n
my_heap.py
def peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\nreturn self.max_heap[0]\n
my_heap.go
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\nreturn h.data[0]\n}\n
my_heap.js
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\nreturn this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\nreturn this.maxHeap[0];\n}\n
my_heap.c
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(maxHeap *h) {\nreturn h->data[0];\n}\n
my_heap.cs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek()\n{\nreturn maxHeap[0];\n}\n
my_heap.swift
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\nmaxHeap[0]\n}\n
my_heap.zig
// \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\nreturn self.max_heap.?.items[0];\n}  
"},{"location":"chapter_heap/heap/#_3","title":"\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\u3002\u56e0\u6b64\uff0c\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\u300c\u5806\u5316 Heapify\u300d\u3002

\u8003\u8651\u4ece\u5165\u5806\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u6267\u884c\u5806\u5316\u3002\u5177\u4f53\u6765\u8bf4\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\u9700\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

<1><2><3><4><5><6>

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.add(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.push_back(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || maxHeap[i] <= maxHeap[p])\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(maxHeap[i], maxHeap[p]);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.py
def push(self, val: int):\n\"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n# \u6dfb\u52a0\u8282\u70b9\nself.max_heap.append(val)\n# \u4ece\u5e95\u81f3\u9876\u5806\u5316\nself.sift_up(self.size() - 1)\ndef sift_up(self, i: int):\n\"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\nwhile True:\n# \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\np = self.parent(i)\n# \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif p < 0 or self.max_heap[i] <= self.max_heap[p]:\nbreak\n# \u4ea4\u6362\u4e24\u8282\u70b9\nself.swap(i, p)\n# \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p\n
my_heap.go
/* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n// \u6dfb\u52a0\u8282\u70b9\nh.data = append(h.data, val)\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nh.siftUp(len(h.data) - 1)\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\nfor true {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\np := h.parent(i)\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif p < 0 || h.data[i].(int) <= h.data[p].(int) {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nh.swap(i, p)\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p\n}\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806 */\npush(val) {\n// \u6dfb\u52a0\u8282\u70b9\nthis.#maxHeap.push(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nthis.#siftUp(this.size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nconst p = this.#parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.#swap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n// \u6dfb\u52a0\u8282\u70b9\nthis.maxHeap.push(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nthis.siftUp(this.size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nconst p = this.parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.swap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806 */\nvoid push(maxHeap *h, int val) {\n// \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\nif (h->size == MAX_SIZE) {\nprintf(\"heap is full!\");\nreturn;\n}\n// \u6dfb\u52a0\u8282\u70b9\nh->data[h->size] = val;\nh->size++;\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(h, h->size - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(maxHeap *h, int i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(h, i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || h->data[i] <= h->data[p]) {\nbreak;\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(h, i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val)\n{\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.Add(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i)\n{\nwhile (true)\n{\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(i);\n// \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\nif (p < 0 || maxHeap[i] <= maxHeap[p])\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.append(val)\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(i: size() - 1)\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\nvar i = i\nwhile true {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nlet p = parent(i: i)\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif p < 0 || maxHeap[i] <= maxHeap[p] {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i: i, j: p)\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p\n}\n}\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n// \u6dfb\u52a0\u8282\u70b9\ntry self.max_heap.?.append(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\ntry self.siftUp(self.size() - 1);\n}  // \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\nvar i = i_;\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nvar p = parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\ntry self.swap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
"},{"location":"chapter_heap/heap/#_4","title":"\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\u4fee\u590d\u53d8\u5f97\u56f0\u96be\u3002\u4e3a\u4e86\u5c3d\u91cf\u51cf\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u53d8\u52a8\uff0c\u6211\u4eec\u91c7\u53d6\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9aa4\uff1a

  1. \u4ea4\u6362\u5806\u9876\u5143\u7d20\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u5373\u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff09\uff1b
  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\u5b9e\u9645\u4e0a\u5220\u9664\u7684\u662f\u539f\u6765\u7684\u5806\u9876\u5143\u7d20\uff09\uff1b
  3. \u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u6267\u884c\u5806\u5316\uff1b

\u987e\u540d\u601d\u4e49\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u7684\u64cd\u4f5c\u65b9\u5411\u4e0e\u4ece\u5e95\u81f3\u9876\u5806\u5316\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\uff1b\u7136\u540e\u5faa\u73af\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u9047\u5230\u65e0\u9700\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

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

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n// \u5224\u7a7a\u5904\u7406\nif (isEmpty())\nthrow new EmptyStackException();\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(0, size() - 1);\n// \u5220\u9664\u8282\u70b9\nint val = maxHeap.remove(size() - 1);\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = left(i), r = right(i), ma = i;\nif (l < size() && maxHeap.get(l) > maxHeap.get(ma))\nma = l;\nif (r < size() && maxHeap.get(r) > maxHeap.get(ma))\nma = r;\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i)\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n// \u5224\u7a7a\u5904\u7406\nif (empty()) {\nthrow out_of_range(\"\u5806\u4e3a\u7a7a\");\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(maxHeap[0], maxHeap[size() - 1]);\n// \u5220\u9664\u8282\u70b9\nmaxHeap.pop_back();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(0);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = left(i), r = right(i), ma = i;\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (l < size() && maxHeap[l] > maxHeap[ma])\nma = l;\nif (r < size() && maxHeap[r] > maxHeap[ma])\nma = r;\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i)\nbreak;\nswap(maxHeap[i], maxHeap[ma]);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.py
def pop(self) -> int:\n\"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n# \u5224\u7a7a\u5904\u7406\nassert not self.is_empty()\n# \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nself.swap(0, self.size() - 1)\n# \u5220\u9664\u8282\u70b9\nval = self.max_heap.pop()\n# \u4ece\u9876\u81f3\u5e95\u5806\u5316\nself.sift_down(0)\n# \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val\ndef sift_down(self, i: int):\n\"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\nwhile True:\n# \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nl, r, ma = self.left(i), self.right(i), i\nif l < self.size() and self.max_heap[l] > self.max_heap[ma]:\nma = l\nif r < self.size() and self.max_heap[r] > self.max_heap[ma]:\nma = r\n# \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif ma == i:\nbreak\n# \u4ea4\u6362\u4e24\u8282\u70b9\nself.swap(i, ma)\n# \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n// \u5224\u7a7a\u5904\u7406\nif h.isEmpty() {\nfmt.Println(\"error\")\nreturn nil\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nh.swap(0, h.size()-1)\n// \u5220\u9664\u8282\u70b9\nval := h.data[len(h.data)-1]\nh.data = h.data[:len(h.data)-1]\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nh.siftDown(0)\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\nfor true {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\nl, r, max := h.left(i), h.right(i), i\nif l < h.size() && h.data[l].(int) > h.data[max].(int) {\nmax = l\n}\nif r < h.size() && h.data[r].(int) > h.data[max].(int) {\nmax = r\n}\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif max == i {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nh.swap(i, max)\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = max\n}\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806 */\npop() {\n// \u5224\u7a7a\u5904\u7406\nif (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nthis.#swap(0, this.size() - 1);\n// \u5220\u9664\u8282\u70b9\nconst val = this.#maxHeap.pop();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nthis.#siftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nconst l = this.#left(i),\nr = this.#right(i);\nlet ma = i;\nif (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\nif (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\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.#swap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n// \u5224\u7a7a\u5904\u7406\nif (this.isEmpty()) throw new RangeError('Heap is empty.');\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nthis.swap(0, this.size() - 1);\n// \u5220\u9664\u8282\u70b9\nconst val = this.maxHeap.pop();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nthis.siftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nconst l = this.left(i),\nr = this.right(i);\nlet ma = i;\nif (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\nif (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\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.swap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806 */\nint pop(maxHeap *h) {\n// \u5224\u7a7a\u5904\u7406\nif (isEmpty(h)) {\nprintf(\"heap is empty!\");\nreturn INT_MAX;\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(h, 0, size(h) - 1);\n// \u5220\u9664\u8282\u70b9\nint val = h->data[h->size - 1];\nh->size--;\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(h, 0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(maxHeap *h, int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\nint l = left(h, i);\nint r = right(h, i);\nint max = i;\nif (l < size(h) && h->data[l] > h->data[max]) {\nmax = l;\n}\nif (r < size(h) && h->data[r] > h->data[max]) {\nmax = r;\n}\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (max == i) {\nbreak;\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(h, i, max);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = max;\n}\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806 */\nint pop()\n{\n// \u5224\u7a7a\u5904\u7406\nif (isEmpty())\nthrow new IndexOutOfRangeException();\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(0, size() - 1);\n// \u5220\u9664\u8282\u70b9\nint val = maxHeap.Last();\nmaxHeap.RemoveAt(size() - 1);\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i)\n{\nwhile (true)\n{\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = left(i), r = right(i), ma = i;\nif (l < size() && maxHeap[l] > maxHeap[ma])\nma = l;\nif (r < size() && maxHeap[r] > maxHeap[ma])\nma = r;\n// \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n// \u5224\u7a7a\u5904\u7406\nif isEmpty() {\nfatalError(\"\u5806\u4e3a\u7a7a\")\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(i: 0, j: size() - 1)\n// \u5220\u9664\u8282\u70b9\nlet val = maxHeap.remove(at: size() - 1)\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(i: 0)\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\nvar i = i\nwhile true {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nlet l = left(i: i)\nlet r = right(i: i)\nvar ma = i\nif l < size(), maxHeap[l] > maxHeap[ma] {\nma = l\n}\nif r < size(), maxHeap[r] > maxHeap[ma] {\nma = r\n}\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif ma == i {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i: i, j: ma)\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n}\n}\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n// \u5224\u65ad\u5904\u7406\nif (self.isEmpty()) unreachable;\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\ntry self.swap(0, self.size() - 1);\n// \u5220\u9664\u8282\u70b9\nvar val = self.max_heap.?.pop();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\ntry self.siftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n} // \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\nvar i = i_;\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nvar l = left(i);\nvar r = right(i);\nvar ma = i;\nif (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\nif (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\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\ntry self.swap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
"},{"location":"chapter_heap/heap/#913","title":"9.1.3. \u00a0 \u5806\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\u4f9d\u6b21\u5c06\u6240\u6709\u5143\u7d20\u5f39\u51fa\uff0c\u4ece\u800c\u5f97\u5230\u4e00\u4e2a\u6709\u5e8f\u5e8f\u5217\u3002\u5f53\u7136\uff0c\u5806\u6392\u5e8f\u7684\u5b9e\u73b0\u65b9\u6cd5\u5e76\u4e0d\u9700\u8981\u5f39\u51fa\u5143\u7d20\uff0c\u800c\u662f\u6bcf\u8f6e\u5c06\u5806\u9876\u5143\u7d20\u4ea4\u6362\u81f3\u6570\u7ec4\u5c3e\u90e8\u5e76\u7f29\u5c0f\u5806\u7684\u957f\u5ea6\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":"9.3. \u00a0 \u5c0f\u7ed3","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
"},{"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\u4e8e\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\u5b9e\u9645\u4e0a\uff0c\u4f60\u5df2\u7ecf\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u5e76\u4e60\u60ef\u5c06\u4ed6\u4eec\u5e94\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\uff0c\u6211\u5c06\u4e3e\u4e24\u4e2a\u5177\u4f53\u4f8b\u5b50\u6765\u8bc1\u5b9e\u8fd9\u4e00\u70b9\u3002

\u4f8b\u4e00\uff1a\u7ec4\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

\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u79ef\u6728\u7684\u5404\u79cd\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u800c\u7ec4\u88c5\u8bf4\u660e\u4e66\u4e0a\u7684\u4e00\u7cfb\u5217\u6b65\u9aa4\u5219\u662f\u7b97\u6cd5\u3002

\u4f8b\u4e8c\uff1a\u67e5\u9605\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\u7684\u82f1\u6587\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\u8fd9\u6837\u64cd\u4f5c\uff1a

  1. \u7ffb\u5f00\u5b57\u5178\u7ea6\u4e00\u534a\u7684\u9875\u6570\uff0c\u67e5\u770b\u8be5\u9875\u9996\u5b57\u6bcd\u662f\u4ec0\u4e48\uff08\u5047\u8bbe\u4e3a \\(m\\) \uff09\uff1b
  2. \u7531\u4e8e\u5728\u82f1\u6587\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\uff1b
  3. \u4e0d\u65ad\u91cd\u590d\u6b65\u9aa4 1-2 \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u9875\u7801\u4e3a\u6b62\u3002
<1><2><3><4><5>

\u67e5\u9605\u5b57\u5178\u8fd9\u4e2a\u5c0f\u5b66\u751f\u5fc5\u5907\u6280\u80fd\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u8457\u540d\u7684\u300c\u4e8c\u5206\u67e5\u627e\u300d\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\u300c\u6570\u7ec4\u300d\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\u662f\u300c\u4e8c\u5206\u67e5\u627e\u300d\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\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

\u9605\u8bfb\u81f3\u6b64\uff0c\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\u90a3\u4e48\u592a\u597d\u4e86\uff01\u56e0\u4e3a\u8fd9\u6b63\u662f\u672c\u4e66\u5b58\u5728\u7684\u610f\u4e49\u3002\u63a5\u4e0b\u6765\uff0c\u8fd9\u672c\u4e66\u5c06\u4e00\u6b65\u6b65\u5f15\u5bfc\u4f60\u6df1\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\u4e60\u4e86\u8bb8\u591a\u201c\u7b97\u6cd5\u201d\uff0c\u7528\u4ee5\u89e3\u51b3\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u95ee\u9898\u3002
  • \u67e5\u9605\u5b57\u5178\u7684\u539f\u7406\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u67e5\u627e\u4f53\u73b0\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u7b97\u6cd5\u601d\u60f3\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\u5219\u662f\u53d1\u6325\u6570\u636e\u7ed3\u6784\u4f5c\u7528\u7684\u821e\u53f0\u3002
  • \u4e50\u9ad8\u79ef\u6728\u5bf9\u5e94\u4e8e\u6570\u636e\uff0c\u79ef\u6728\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u62fc\u88c5\u79ef\u6728\u7684\u6b65\u9aa4\u5219\u5bf9\u5e94\u7b97\u6cd5\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":"

\u300c\u7b97\u6cd5 Algorithm\u300d\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\u3002\u7b97\u6cd5\u5177\u6709\u4ee5\u4e0b\u7279\u6027\uff1a

  • \u95ee\u9898\u662f\u660e\u786e\u7684\uff0c\u5177\u6709\u6e05\u6670\u7684\u8f93\u5165\u548c\u8f93\u51fa\u5b9a\u4e49\u3002
  • \u89e3\u5177\u6709\u786e\u5b9a\u6027\uff0c\u5373\u7ed9\u5b9a\u76f8\u540c\u7684\u8f93\u5165\u65f6\uff0c\u8f93\u51fa\u59cb\u7ec8\u76f8\u540c\u3002
  • \u5177\u6709\u53ef\u884c\u6027\uff0c\u5728\u6709\u9650\u6b65\u9aa4\u3001\u65f6\u95f4\u548c\u5185\u5b58\u7a7a\u95f4\u4e0b\u53ef\u5b8c\u6210\u3002
"},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2. \u00a0 \u6570\u636e\u7ed3\u6784\u5b9a\u4e49","text":"

\u300c\u6570\u636e\u7ed3\u6784 Data Structure\u300d\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u4e3a\u4e86\u63d0\u9ad8\u6570\u636e\u5b58\u50a8\u548c\u64cd\u4f5c\u6027\u80fd\uff0c\u6570\u636e\u7ed3\u6784\u7684\u8bbe\u8ba1\u76ee\u6807\u5305\u62ec\uff1a

  • \u7a7a\u95f4\u5360\u7528\u5c3d\u91cf\u51cf\u5c11\uff0c\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\u5229\u4e8e\u7b97\u6cd5\u9ad8\u6548\u8fd0\u884c\u3002

\u6570\u636e\u7ed3\u6784\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5145\u6ee1\u6743\u8861\u7684\u8fc7\u7a0b\uff0c\u8fd9\u610f\u5473\u7740\u8981\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u4f18\u52bf\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u534f\u3002\u4f8b\u5982\uff0c\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\uff1b\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":"

\u300c\u6570\u636e\u7ed3\u6784\u300d\u4e0e\u300c\u7b97\u6cd5\u300d\u9ad8\u5ea6\u76f8\u5173\u4e14\u7d27\u5bc6\u7ed3\u5408\uff0c\u5177\u4f53\u8868\u73b0\u5728\uff1a

  • \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\u7528\u4e8e\u64cd\u4f5c\u6570\u636e\u7684\u65b9\u6cd5\u3002
  • \u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u7684\u821e\u53f0\u3002\u6570\u636e\u7ed3\u6784\u672c\u8eab\u4ec5\u5b58\u50a8\u6570\u636e\u4fe1\u606f\uff0c\u901a\u8fc7\u7ed3\u5408\u7b97\u6cd5\u624d\u80fd\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u3002
  • \u7279\u5b9a\u7b97\u6cd5\u901a\u5e38\u6709\u5bf9\u5e94\u6700\u4f18\u7684\u6570\u636e\u7ed3\u6784\u3002\u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u4e8e\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u8fdb\u884c\u5b9e\u73b0\uff0c\u4f46\u6700\u7ec8\u6267\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\u3002

Fig. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb

\u7c7b\u6bd4\u300cLEGO \u4e50\u9ad8\u300d\u548c\u300c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u300d\uff0c\u5219\u5bf9\u5e94\u5173\u7cfb\u5982\u4e0b\u8868\u6240\u793a\u3002

\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 LEGO \u4e50\u9ad8 \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\u6ce8\u610f\u7684\u662f\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u72ec\u7acb\u4e8e\u7f16\u7a0b\u8bed\u8a00\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u4e66\u5f97\u4ee5\u63d0\u4f9b\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\u300c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u300d\u7b80\u79f0\u4e3a\u300c\u7b97\u6cd5\u300d\u3002\u4f8b\u5982\uff0c\u4f17\u6240\u5468\u77e5\u7684 LeetCode \u7b97\u6cd5\u9898\u76ee\uff0c\u5b9e\u9645\u4e0a\u540c\u65f6\u8003\u5bdf\u4e86\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e24\u65b9\u9762\u7684\u77e5\u8bc6\u3002

"},{"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\u514d\u8d39\u3001\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\u3001\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\uff1b
  • \u7b97\u6cd5\u6e90\u4ee3\u7801\u7686\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u652f\u6301 Java, C++, Python, Go, JS, TS, C#, Swift, Zig \u7b49\u8bed\u8a00\uff1b
  • \u9f13\u52b1\u8bfb\u8005\u5728\u7ae0\u8282\u8ba8\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\uff1b
"},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1. \u00a0 \u8bfb\u8005\u5bf9\u8c61","text":"

\u82e5\u60a8\u662f\u300c\u7b97\u6cd5\u521d\u5b66\u8005\u300d\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\u8fd9\u672c\u4e66\u6b63\u662f\u4e3a\u60a8\u91cf\u8eab\u5b9a\u5236\uff01

\u5982\u679c\u60a8\u662f\u300c\u7b97\u6cd5\u8001\u624b\u300d\uff0c\u5df2\u7ecf\u79ef\u7d2f\u4e00\u5b9a\u5237\u9898\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u9898\u578b\uff0c\u90a3\u4e48\u672c\u4e66\u53ef\u52a9\u60a8\u56de\u987e\u4e0e\u68b3\u7406\u7b97\u6cd5\u77e5\u8bc6\u4f53\u7cfb\uff0c\u4ed3\u5e93\u6e90\u4ee3\u7801\u53ef\u4ee5\u88ab\u5f53\u4f5c\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u6216\u201c\u7b97\u6cd5\u5b57\u5178\u201d\u6765\u4f7f\u7528\u3002

\u82e5\u60a8\u662f\u300c\u7b97\u6cd5\u4e13\u5bb6\u300d\uff0c\u6211\u4eec\u671f\u5f85\u6536\u5230\u60a8\u7684\u5b9d\u8d35\u5efa\u8bae\uff0c\u6216\u8005\u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c\u3002

\u524d\u7f6e\u6761\u4ef6

\u60a8\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\u4e3b\u8981\u5185\u5bb9\u5305\u62ec\uff1a

  • \u590d\u6742\u5ea6\u5206\u6790\uff1a\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8bc4\u4ef7\u7ef4\u5ea6\u3001\u7b97\u6cd5\u6548\u7387\u7684\u8bc4\u4f30\u65b9\u6cd5\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5305\u62ec\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u793a\u4f8b\u7b49\u3002
  • \u6570\u636e\u7ed3\u6784\uff1a\u5e38\u89c1\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u5f62\u5f0f\u3001\u6570\u636e\u7ed3\u6784\u7684\u5206\u7c7b\u65b9\u6cd5\u3002\u6d89\u53ca\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u6563\u5217\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\uff0c\u5185\u5bb9\u5305\u62ec\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\u67e5\u627e\u7b97\u6cd5\u3001\u6392\u5e8f\u7b97\u6cd5\u3001\u641c\u7d22\u4e0e\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u5206\u6cbb\u7b97\u6cd5\u7b49\uff0c\u5185\u5bb9\u6db5\u76d6\u5b9a\u4e49\u3001\u5e94\u7528\u573a\u666f\u3001\u4f18\u7f3a\u70b9\u3001\u65f6\u7a7a\u6548\u7387\u3001\u5b9e\u73b0\u65b9\u6cd5\u3001\u793a\u4f8b\u9898\u76ee\u7b49\u3002

Fig. Hello \u7b97\u6cd5\u5185\u5bb9\u7ed3\u6784

"},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3. \u00a0 \u81f4\u8c22","text":"

\u5728\u672c\u4e66\u7684\u521b\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8bb8\u591a\u4eba\u7684\u5e2e\u52a9\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a

  • \u611f\u8c22\u6211\u5728\u516c\u53f8\u7684\u5bfc\u5e08\u674e\u6c50\u535a\u58eb\uff0c\u5728\u6df1\u5165\u4ea4\u8c08\u4e2d\u60a8\u9f13\u52b1\u6211\u201c\u884c\u52a8\u8d77\u6765\u201d\uff0c\u575a\u5b9a\u4e86\u6211\u5199\u8fd9\u672c\u4e66\u7684\u51b3\u5fc3\u3002
  • \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\u3002
  • \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 \"Hello World!\" \u7684\u7f8e\u597d\u56de\u5fc6\u3002
  • \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\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\u3002
  • \u611f\u8c22 @squidfunk \u63d0\u4f9b\u7684\u5199\u4f5c\u6392\u7248\u5efa\u8bae\uff0c\u4ee5\u53ca\u6770\u51fa\u7684\u5f00\u6e90\u9879\u76ee 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\u4eec\u7684\u6770\u51fa\u8d21\u732e\uff01

\u672c\u4e66\u5021\u5bfc\u201c\u624b\u8111\u5e76\u7528\u201d\u7684\u5b66\u4e60\u65b9\u6cd5\uff0c\u5728\u6b64\u65b9\u9762\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\u8457\u4f5c\uff0c\u5305\u62ec\u4e2d\u6587\u7248\u3001\u82f1\u6587\u7248\u3001\u674e\u6c90\u8001\u5e08 bilibili \u4e3b\u9875\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\u4e9b\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\u60a8\u901a\u8bfb\u672c\u8282\u5185\u5bb9\u3002

"},{"location":"chapter_preface/suggestions/#021","title":"0.2.1. \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\uff1a

  1. \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\u5185\u5bb9\u3002
  2. \u5237\u7b97\u6cd5\u9898\u3002\u5efa\u8bae\u4ece\u70ed\u95e8\u9898\u76ee\u5f00\u5237\uff0c\u5982\u5251\u6307 Offer\u548cLeetCode Hot 100\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-5 \u8f6e\u7684\u91cd\u590d\u540e\uff0c\u5c31\u80fd\u5c06\u5176\u7262\u8bb0\u5728\u5fc3\u3002
  3. \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

\u4f5c\u4e3a\u4e00\u672c\u5165\u95e8\u6559\u7a0b\uff0c\u672c\u4e66\u5185\u5bb9\u4e3b\u8981\u6db5\u76d6\u201c\u7b2c\u4e00\u9636\u6bb5\u201d\uff0c\u65e8\u5728\u5e2e\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u5f00\u7b2c\u4e8c\u548c\u7b2c\u4e09\u9636\u6bb5\u7684\u5b66\u4e60\u3002

Fig. \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf

"},{"location":"chapter_preface/suggestions/#022","title":"0.2.2. \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\u5efa\u8bae\u53ef\u4ee5\u5148\u8df3\u8fc7\u3002

\u6587\u7ae0\u4e2d\u7684\u91cd\u8981\u540d\u8bcd\u4f1a\u7528 \u300c \u300d \u62ec\u53f7\u6807\u6ce8\uff0c\u4f8b\u5982 \u300c\u6570\u7ec4 Array\u300d \u3002\u8bf7\u52a1\u5fc5\u8bb0\u4f4f\u8fd9\u4e9b\u540d\u8bcd\uff0c\u5305\u62ec\u82f1\u6587\u7ffb\u8bd1\uff0c\u4ee5\u4fbf\u540e\u7eed\u9605\u8bfb\u6587\u732e\u65f6\u4f7f\u7528\u3002

\u52a0\u7c97\u7684\u6587\u5b57 \u8868\u793a\u91cd\u70b9\u5185\u5bb9\u6216\u603b\u7ed3\u6027\u8bed\u53e5\uff0c\u8fd9\u7c7b\u6587\u5b57\u503c\u5f97\u7279\u522b\u5173\u6ce8\u3002

\u4e13\u6709\u540d\u8bcd\u548c\u6709\u7279\u6307\u542b\u4e49\u7684\u8bcd\u53e5\u4f1a\u4f7f\u7528 \u201c\u53cc\u5f15\u53f7\u201d \u6807\u6ce8\uff0c\u4ee5\u907f\u514d\u6b67\u4e49\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n// \u591a\u884c\n// \u6ce8\u91ca\n
"},{"location":"chapter_preface/suggestions/#023","title":"0.2.3. \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\u56e0\u6b64\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\u548c\u56fe\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5219\u4f5c\u4e3a\u52a8\u753b\u548c\u56fe\u7247\u7684\u89e3\u91ca\u4e0e\u8865\u5145\u3002

\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5982\u679c\u53d1\u73b0\u67d0\u6bb5\u5185\u5bb9\u63d0\u4f9b\u4e86\u52a8\u753b\u6216\u56fe\u89e3\uff0c\u5efa\u8bae\u4ee5\u56fe\u4e3a\u4e3b\u7ebf\uff0c\u4ee5\u6587\u5b57\uff08\u901a\u5e38\u4f4d\u4e8e\u56fe\u50cf\u4e0a\u65b9\uff09\u4e3a\u8f85\uff0c\u7efc\u5408\u4e24\u8005\u6765\u7406\u89e3\u5185\u5bb9\u3002

Fig. \u52a8\u753b\u56fe\u89e3\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#024","title":"0.2.4. \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

\u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\u5728GitHub \u4ed3\u5e93\uff0c\u6e90\u4ee3\u7801\u5305\u542b\u8be6\u7ec6\u6ce8\u91ca\uff0c\u5e76\u9644\u6709\u6d4b\u8bd5\u6837\u4f8b\uff0c\u53ef\u76f4\u63a5\u8fd0\u884c\u3002

\u5982\u679c\u5b66\u4e60\u65f6\u95f4\u6709\u9650\uff0c\u5efa\u8bae\u4f60\u81f3\u5c11\u901a\u8bfb\u5e76\u8fd0\u884c\u6240\u6709\u4ee3\u7801\u3002\u5982\u679c\u65f6\u95f4\u5145\u88d5\uff0c\u5efa\u8bae\u53c2\u7167\u4ee3\u7801\u81ea\u884c\u6572\u4e00\u904d\u3002\u4e0e\u4ec5\u9605\u8bfb\u4ee3\u7801\u76f8\u6bd4\uff0c\u7f16\u5199\u4ee3\u7801\u7684\u8fc7\u7a0b\u5f80\u5f80\u80fd\u5e26\u6765\u66f4\u591a\u6536\u83b7\u3002

Fig. \u8fd0\u884c\u4ee3\u7801\u793a\u4f8b

\u7b2c\u4e00\u6b65\uff1a\u5b89\u88c5\u672c\u5730\u7f16\u7a0b\u73af\u5883\u3002\u8bf7\u53c2\u7167\u9644\u5f55\u6559\u7a0b\u8fdb\u884c\u5b89\u88c5\uff0c\u5982\u679c\u5df2\u5b89\u88c5\u5219\u53ef\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002

\u7b2c\u4e8c\u6b65\uff1a\u4e0b\u8f7d\u4ee3\u7801\u4ed3\u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5 Git \uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u4ed3\u5e93\u3002

git clone https://github.com/krahets/hello-algo.git\n

\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u70b9\u51fb\u201cDownload ZIP\u201d\u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u538b\u7f29\u5305\uff0c\u7136\u540e\u5728\u672c\u5730\u89e3\u538b\u5373\u53ef\u3002

Fig. \u514b\u9686\u4ed3\u5e93\u4e0e\u4e0b\u8f7d\u4ee3\u7801

\u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u6e90\u4ee3\u7801\u3002\u5982\u679c\u4ee3\u7801\u5757\u9876\u90e8\u6807\u6709\u6587\u4ef6\u540d\u79f0\uff0c\u5219\u53ef\u4ee5\u5728\u4ed3\u5e93\u7684 codes \u6587\u4ef6\u5939\u4e2d\u627e\u5230\u76f8\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6\u3002\u6e90\u4ee3\u7801\u6587\u4ef6\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

Fig. \u4ee3\u7801\u5757\u4e0e\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6

"},{"location":"chapter_preface/suggestions/#025","title":"0.2.5. \u00a0 \u5728\u63d0\u95ee\u8ba8\u8bba\u4e2d\u5171\u540c\u6210\u957f","text":"

\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u8bf7\u4e0d\u8981\u201c\u60ef\u7740\u201d\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\u5176\u4ed6\u5c0f\u4f19\u4f34\u4eec\u5c06\u7aed\u8bda\u4e3a\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5728\u4e24\u5929\u5185\u5f97\u5230\u56de\u590d\u3002

\u540c\u65f6\uff0c\u4e5f\u5e0c\u671b\u60a8\u80fd\u5728\u8bc4\u8bba\u533a\u591a\u82b1\u4e9b\u65f6\u95f4\u3002\u4e00\u65b9\u9762\uff0c\u60a8\u53ef\u4ee5\u4e86\u89e3\u5927\u5bb6\u9047\u5230\u7684\u95ee\u9898\uff0c\u4ece\u800c\u67e5\u6f0f\u8865\u7f3a\uff0c\u8fd9\u5c06\u6709\u52a9\u4e8e\u6fc0\u53d1\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5e0c\u671b\u60a8\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u4f19\u4f34\u7684\u95ee\u9898\u3001\u5206\u4eab\u60a8\u7684\u89c1\u89e3\uff0c\u8ba9\u5927\u5bb6\u5171\u540c\u5b66\u4e60\u548c\u8fdb\u6b65\u3002

Fig. \u8bc4\u8bba\u533a\u793a\u4f8b

"},{"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\u5bf9\u4e8e\u5df2\u5177\u5907\u4e00\u5b9a\u79ef\u7d2f\u7684\u540c\u5b66\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u540c\u65f6\u6e90\u4ee3\u7801\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\u3001\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u7edd\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\u7c4d\u81f3\u5173\u91cd\u8981\uff0c\u6709\u52a9\u4e8e\u907f\u514d\u8d70\u5f2f\u8def\u3002
  • \u4e66\u5185\u7684\u52a8\u753b\u548c\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\uff0c\u9605\u8bfb\u65f6\u5e94\u7ed9\u4e88\u66f4\u591a\u5173\u6ce8\u3002
  • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\uff0c\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u6253\u4ee3\u7801\u3002
  • \u672c\u4e66\u8bbe\u6709\u8ba8\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\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] \u4e25\u851a\u654f. \u6570\u636e\u7ed3\u6784\uff08C \u8bed\u8a00\u7248\uff09.

[4] \u9093\u4fca\u8f89. \u6570\u636e\u7ed3\u6784\uff08C++ \u8bed\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

[5] \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.

[6] \u7a0b\u6770. \u5927\u8bdd\u6570\u636e\u7ed3\u6784.

[7] \u738b\u4e89. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u7f8e.

[8] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

[9] Aston Zhang, et al. Dive into Deep Learning.

"},{"location":"chapter_searching/replace_linear_by_hashing/","title":"12.2. \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565","text":"

\u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u65f6\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\u4ee5 LeetCode \u5168\u7ad9\u7b2c\u4e00\u9898 \u4e24\u6570\u4e4b\u548c \u4e3a\u4f8b\u3002

\u4e24\u6570\u4e4b\u548c

\u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u6574\u6570\u76ee\u6807\u503c target \uff0c\u8bf7\u4f60\u5728\u8be5\u6570\u7ec4\u4e2d\u627e\u51fa\u201c\u548c\u201d\u4e3a\u76ee\u6807\u503c target \u7684\u90a3\u4e24\u4e2a\u6574\u6570\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u4e0b\u6807\u3002

\u4f60\u53ef\u4ee5\u5047\u8bbe\u6bcf\u79cd\u8f93\u5165\u53ea\u4f1a\u5bf9\u5e94\u4e00\u4e2a\u7b54\u6848\u3002\u4f46\u662f\uff0c\u6570\u7ec4\u4e2d\u540c\u4e00\u4e2a\u5143\u7d20\u5728\u7b54\u6848\u91cc\u4e0d\u80fd\u91cd\u590d\u51fa\u73b0\u3002

\u4f60\u53ef\u4ee5\u6309\u4efb\u610f\u987a\u5e8f\u8fd4\u56de\u7b54\u6848\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1221","title":"12.2.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\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

\uff08\u56fe\uff09

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig leetcode_two_sum.java
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target) {\nint size = nums.length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (int i = 0; i < size - 1; i++) {\nfor (int j = i + 1; j < size; j++) {\nif (nums[i] + nums[j] == target)\nreturn new int[] { i, j };\n}\n}\nreturn new int[0];\n}\n
leetcode_two_sum.cpp
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\nint size = nums.size();\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (int i = 0; i < size - 1; i++) {\nfor (int j = i + 1; j < size; j++) {\nif (nums[i] + nums[j] == target)\nreturn {i, j};\n}\n}\nreturn {};\n}\n
leetcode_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 O(n^2)\nfor i in range(len(nums) - 1):\nfor j in range(i + 1, len(nums)):\nif nums[i] + nums[j] == target:\nreturn [i, j]\nreturn []\n
leetcode_two_sum.go
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums []int, target int) []int {\nsize := len(nums)\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor i := 0; i < size-1; i++ {\nfor j := i + 1; i < size; j++ {\nif nums[i]+nums[j] == target {\nreturn []int{i, j}\n}\n}\n}\nreturn nil\n}\n
leetcode_two_sum.js
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums, target) {\nconst n = nums.length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (let i = 0; i < n; i++) {\nfor (let j = i + 1; j < n; j++) {\nif (nums[i] + nums[j] === target) {\nreturn [i, j];\n}\n}\n}\nreturn [];\n}\n
leetcode_two_sum.ts
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\nconst n = nums.length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (let i = 0; i < n; i++) {\nfor (let j = i + 1; j < n; j++) {\nif (nums[i] + nums[j] === target) {\nreturn [i, j];\n}\n}\n}\nreturn [];\n}\n
leetcode_two_sum.c
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\nfor (int i = 0; i < numsSize; ++i) {\nfor (int j = i + 1; j < numsSize; ++j) {\nif (nums[i] + nums[j] == target) {\nint *res = malloc(sizeof(int) * 2);\nres[0] = i, res[1] = j;\n*returnSize = 2;\nreturn res;\n}\n}\n}\n*returnSize = 0;\nreturn NULL;\n}\n
leetcode_two_sum.cs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target)\n{\nint size = nums.Length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (int i = 0; i < size - 1; i++)\n{\nfor (int j = i + 1; j < size; j++)\n{\nif (nums[i] + nums[j] == target)\nreturn new int[] { i, j };\n}\n}\nreturn new int[0];\n}\n
leetcode_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 O(n^2)\nfor i in nums.indices.dropLast() {\nfor j in nums.indices.dropFirst(i + 1) {\nif nums[i] + nums[j] == target {\nreturn [i, j]\n}\n}\n}\nreturn [0]\n}\n
leetcode_two_sum.zig
// \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\nvar size: usize = nums.len;\nvar i: usize = 0;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nwhile (i < size - 1) : (i += 1) {\nvar j = i + 1;\nwhile (j < size) : (j += 1) {\nif (nums[i] + nums[j] == target) {\nreturn [_]i32{@intCast(i32, i), @intCast(i32, j)};\n}\n}\n}\nreturn null;\n}\n

\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/#1222","title":"12.2.2. \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u5c06\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u6784\u5efa\u4e3a\u952e\u503c\u5bf9\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20 num \u5e76\u6267\u884c\uff1a

  1. \u5224\u65ad\u6570\u5b57 target - num \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\u5219\u76f4\u63a5\u8fd4\u56de\u8be5\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1b
  2. \u5c06\u5143\u7d20 num \u548c\u5176\u7d22\u5f15\u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\uff1b

\uff08\u56fe\uff09

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig leetcode_two_sum.java
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\nint size = nums.length;\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nMap<Integer, Integer> dic = new HashMap<>();\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (int i = 0; i < size; i++) {\nif (dic.containsKey(target - nums[i])) {\nreturn new int[] { dic.get(target - nums[i]), i };\n}\ndic.put(nums[i], i);\n}\nreturn new int[0];\n}\n
leetcode_two_sum.cpp
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\nint size = nums.size();\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nunordered_map<int, int> dic;\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (int i = 0; i < size; i++) {\nif (dic.find(target - nums[i]) != dic.end()) {\nreturn {dic[target - nums[i]], i};\n}\ndic.emplace(nums[i], i);\n}\nreturn {};\n}\n
leetcode_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 O(n)\ndic = {}\n# \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor i in range(len(nums)):\nif target - nums[i] in dic:\nreturn [dic[target - nums[i]], i]\ndic[nums[i]] = i\nreturn []\n
leetcode_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 O(n)\nhashTable := map[int]int{}\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor idx, val := range nums {\nif preIdx, ok := hashTable[target-val]; ok {\nreturn []int{preIdx, idx}\n}\nhashTable[val] = idx\n}\nreturn nil\n}\n
leetcode_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 O(n)\nlet m = {};\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (let i = 0; i < nums.length; i++) {\nif (m[nums[i]] !== undefined) {\nreturn [m[nums[i]], i];\n} else {\nm[target - nums[i]] = i;\n}\n}\nreturn [];\n}\n
leetcode_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 O(n)\nlet m: Map<number, number> = new Map();\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (let i = 0; i < nums.length; i++) {\nlet index = m.get(nums[i]);\nif (index !== undefined) {\nreturn [index, i];\n} else {\nm.set(target - nums[i], i);\n}\n}\nreturn [];\n}\n
leetcode_two_sum.c
/* \u54c8\u5e0c\u8868 */\nstruct hashTable {\nint key;\nint val;\nUT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n};\n/* \u54c8\u5e0c\u8868\u67e5\u8be2 */\nhashTable *find(hashTable *h, int key) {\nhashTable *tmp;\nHASH_FIND_INT(h, &key, tmp);\nreturn tmp;\n}\n/* \u54c8\u5e0c\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(hashTable *h, int key, int val) {\nhashTable *t = find(h, key);\nif (t == NULL) {\nhashTable *tmp = malloc(sizeof(hashTable));\ntmp->key = key, tmp->val = val;\nHASH_ADD_INT(h, key, tmp);\n} else {\nt->val = val;\n}\n}\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\nhashTable *hashtable = NULL;\nfor (int i = 0; i < numsSize; i++) {\nhashTable *t = find(hashtable, target - nums[i]);\nif (t != NULL) {\nint *res = malloc(sizeof(int) * 2);\nres[0] = t->val, res[1] = i;\n*returnSize = 2;\nreturn res;\n}\ninsert(hashtable, nums[i], i);\n}\n*returnSize = 0;\nreturn NULL;\n}\n
leetcode_two_sum.cs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target)\n{\nint size = nums.Length;\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nDictionary<int, int> dic = new();\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (int i = 0; i < size; i++)\n{\nif (dic.ContainsKey(target - nums[i]))\n{\nreturn new int[] { dic[target - nums[i]], i };\n}\ndic.Add(nums[i], i);\n}\nreturn new int[0];\n}\n
leetcode_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 O(n)\nvar dic: [Int: Int] = [:]\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor i in nums.indices {\nif let j = dic[target - nums[i]] {\nreturn [j, i]\n}\ndic[nums[i]] = i\n}\nreturn [0]\n}\n
leetcode_two_sum.zig
// \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\nvar size: usize = nums.len;\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nvar dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\ndefer dic.deinit();\nvar i: usize = 0;\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nwhile (i < size) : (i += 1) {\nif (dic.contains(target - nums[i])) {\nreturn [_]i32{dic.get(target - nums[i]).?, @intCast(i32, i)};\n}\ntry dic.put(nums[i], @intCast(i32, i));\n}\nreturn null;\n}\n

\u6b64\u65b9\u6cd5\u901a\u8fc7\u54c8\u5e0c\u67e5\u627e\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u4f4e\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":"12.1. \u00a0 \u641c\u7d22\u7b97\u6cd5","text":"

\u300c\u641c\u7d22\u7b97\u6cd5 Searching Algorithm\u300d\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

\u6211\u4eec\u5df2\u7ecf\u5b66\u8fc7\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u65b9\u6cd5\uff0c\u4e5f\u5b66\u8fc7\u54c8\u5e0c\u8868\u3001\u4e8c\u53c9\u641c\u7d22\u6811\u7b49\u53ef\u7528\u4e8e\u5b9e\u73b0\u67e5\u8be2\u7684\u590d\u6742\u6570\u636e\u7ed3\u6784\u3002\u56e0\u6b64\uff0c\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\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/#1211","title":"12.1.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

  • \u300c\u7ebf\u6027\u641c\u7d22\u300d\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
  • \u300c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u300d\u548c\u300c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u300d\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\u662f\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\uff0c\u6cbf\u7740\u4e00\u6761\u8def\u5f84\u8d70\u5230\u5934\u4e3a\u6b62\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\u9700\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/#1212","title":"12.1.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

  • \u300c\u4e8c\u5206\u67e5\u627e\u300d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\u5b9e\u73b0\u9ad8\u6548\u67e5\u627e\uff0c\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002
  • \u300c\u54c8\u5e0c\u67e5\u627e\u300d\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
  • \u300c\u6811\u67e5\u627e\u300d\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\u652f\u3002

Note

\u81ea\u9002\u5e94\u641c\u7d22\u7b97\u6cd5\u5e38\u88ab\u79f0\u4e3a\u67e5\u627e\u7b97\u6cd5\uff0c\u4e3b\u8981\u5173\u6ce8\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u68c0\u7d22\u76ee\u6807\u5143\u7d20\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1213","title":"12.1.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\u5728\u8be5\u6570\u636e\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\u3002\u5404\u4e2a\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u4e0b\u56fe\u6240\u793a\u3002

Fig. \u591a\u79cd\u641c\u7d22\u7b56\u7565

\u4e0a\u8ff0\u51e0\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u4e0e\u7279\u6027\u5982\u4e0b\u8868\u6240\u793a\u3002

\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

\u9664\u4e86\u4ee5\u4e0a\u8868\u683c\u5185\u5bb9\uff0c\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\u9700\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\u79bb\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\u5f00\u9500\u3002
"},{"location":"chapter_searching/summary/","title":"12.3. \u00a0 \u5c0f\u7ed3","text":"
  • \u4e8c\u5206\u67e5\u627e\u4f9d\u8d56\u4e8e\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u5faa\u73af\u9010\u6b65\u7f29\u51cf\u4e00\u534a\u641c\u7d22\u533a\u95f4\u6765\u5b9e\u73b0\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\u9700\u5bf9\u6570\u636e\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\u5408\u5bf9\u67e5\u8be2\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u4e14\u65e0\u9700\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\u4f4e\u81f3 \\(O(1)\\) \u3002
"},{"location":"chapter_sorting/bubble_sort/","title":"11.2. \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

\u300c\u5192\u6ce1\u6392\u5e8f Bubble Sort\u300d\u7684\u5de5\u4f5c\u539f\u7406\u7c7b\u4f3c\u4e8e\u6ce1\u6ce1\u5728\u6c34\u4e2d\u7684\u6d6e\u52a8\u3002\u5728\u6c34\u4e2d\uff0c\u8f83\u5927\u7684\u6ce1\u6ce1\u4f1a\u6700\u5148\u6d6e\u5230\u6c34\u9762\u3002

\u300c\u5192\u6ce1\u64cd\u4f5c\u300d\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u4e86\u4e0a\u8ff0\u8fc7\u7a0b\uff0c\u5177\u4f53\u505a\u6cd5\u4e3a\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\u5b83\u4fe9\u3002\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6700\u5927\u7684\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u5230\u6570\u7ec4\u7684\u6700\u53f3\u7aef\u3002

\u5728\u5b8c\u6210\u4e00\u6b21\u5192\u6ce1\u64cd\u4f5c\u540e\uff0c\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u5df2\u4f4d\u4e8e\u6b63\u786e\u4f4d\u7f6e\uff0c\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\u3002

<1><2><3><4><5><6><7>

"},{"location":"chapter_sorting/bubble_sort/#1121","title":"11.2.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8bbe\u8f93\u5165\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6574\u4e2a\u5192\u6ce1\u6392\u5e8f\u7684\u6b65\u9aa4\u4e3a\uff1a

  1. \u5b8c\u6210\u7b2c\u4e00\u8f6e\u300c\u5192\u6ce1\u300d\u540e\uff0c\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u5df2\u4f4d\u4e8e\u6b63\u786e\u4f4d\u7f6e\uff0c\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\uff1b
  2. \u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u5192\u6ce1\u64cd\u4f5c\uff0c\u53ef\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\uff0c\u56e0\u800c\u5f85\u6392\u5e8f\u5143\u7d20\u53ea\u5269 \\(n - 2\\) \u4e2a\uff1b
  3. \u5982\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u5192\u6ce1\u64cd\u4f5c\uff0c\u6574\u4e2a\u6570\u7ec4\u4fbf\u5b8c\u6210\u6392\u5e8f\uff1b

Fig. \u5192\u6ce1\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\n}\n}\n}\n}\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n// \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\nswap(nums[j], nums[j + 1]);\n}\n}\n}\n}\n
bubble_sort.py
def bubble_sort(nums: list[int]) -> None:\n\"\"\"\u5192\u6ce1\u6392\u5e8f\"\"\"\nn: int = len(nums)\n# \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in range(n - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in range(i):\nif nums[j] > nums[j + 1]:\n# \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j + 1] = nums[j + 1], nums[j]\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j := 0; j < i; j++ {\nif nums[j] > nums[j+1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j+1] = nums[j+1], nums[j]\n}\n}\n}\n}\n
bubble_sort.js
/* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = 0; i < size - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < size - 1 - i; j++) {\nif (nums[j] > nums[j + 1]) {\nint temp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = temp;\n}\n}\n}\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums)\n{\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.Length - 1; i > 0; i--)\n{\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++)\n{\nif (nums[j] > nums[j + 1])\n{\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\n}\n}\n}\n}\n
bubble_sort.swift
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in stride(from: 0, to: i, by: 1) {\nif nums[j] > nums[j + 1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\n}\n}\n}\n}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nvar i: usize = nums.len - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nwhile (j < i) : (j += 1) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nvar tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\n}\n}\n}\n}\n
"},{"location":"chapter_sorting/bubble_sort/#1122","title":"11.2.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n^2)\\) \uff1a\u5404\u8f6e\u5192\u6ce1\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\) , \\(n - 2\\) , \\(\\cdots\\) , \\(2\\) , \\(1\\) \uff0c\u603b\u548c\u4e3a \\(\\frac{(n - 1) n}{2}\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002\u5728\u5f15\u5165\u4e0b\u6587\u7684 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \uff0c\u6240\u4ee5\u5b83\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u662f\u201c\u539f\u5730\u6392\u5e8f\u201d\u3002

\u7531\u4e8e\u5192\u6ce1\u64cd\u4f5c\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\uff0c\u56e0\u6b64\u5192\u6ce1\u6392\u5e8f\u662f\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/bubble_sort/#1123","title":"11.2.3. \u00a0 \u6548\u7387\u4f18\u5316","text":"

\u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u5192\u6ce1\u64cd\u4f5c\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\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.length - 1; i > 0; i--) {\nboolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag)\nbreak; // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n}\n}\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.size() - 1; i > 0; i--) {\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n// \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\nswap(nums[j], nums[j + 1]);\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag)\nbreak; // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n}\n}\n
bubble_sort.py
def bubble_sort_with_flag(nums: list[int]) -> None:\n\"\"\"\u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\"\"\"\nn: int = len(nums)\n# \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in range(n - 1, 0, -1):\nflag: bool = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n# \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in range(i):\nif nums[j] > nums[j + 1]:\n# \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j + 1] = nums[j + 1], nums[j]\nflag = True  # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\nif not flag:\nbreak  # \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := len(nums) - 1; i > 0; i-- {\nflag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j := 0; j < i; j++ {\nif nums[j] > nums[j+1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j+1] = nums[j+1], nums[j]\nflag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif flag == false { // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\nbreak\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag) break; // \u6b64\u8f6e\u5192\u6ce1\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag) break; // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = 0; i < size - 1; i++) {\nbool flag = false;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < size - 1 - i; j++) {\nif (nums[j] > nums[j + 1]) {\nint temp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = temp;\nflag = true;\n}\n}\nif (!flag)\nbreak;\n}\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(int[] nums)\n{\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.Length - 1; i > 0; i--)\n{\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++)\n{\nif (nums[j] > nums[j + 1])\n{\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true;  // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag) break;     // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\nvar flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\nfor j in stride(from: 0, to: i, by: 1) {\nif nums[j] > nums[j + 1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\nflag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif !flag { // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\nbreak\n}\n}\n}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nvar i: usize = nums.len - 1;\nwhile (i > 0) : (i -= 1) {\nvar flag = false;   // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nwhile (j < i) : (j += 1) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nvar tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true;\n}\n}\nif (!flag) break;   // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n}\n}\n
"},{"location":"chapter_sorting/bucket_sort/","title":"11.6. \u00a0 \u6876\u6392\u5e8f","text":"

\u524d\u8ff0\u7684\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\u6c34\u5e73\u3002

\u300c\u6876\u6392\u5e8f Bucket Sort\u300d\u662f\u5206\u6cbb\u601d\u60f3\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/#1161","title":"11.6.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8003\u8651\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u5143\u7d20\u662f\u8303\u56f4 \\([0, 1)\\) \u7684\u6d6e\u70b9\u6570\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a

  1. \u521d\u59cb\u5316 \\(k\\) \u4e2a\u6876\uff0c\u5c06 \\(n\\) \u4e2a\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u4e2a\u6876\u4e2d\uff1b
  2. \u5bf9\u6bcf\u4e2a\u6876\u5206\u522b\u6267\u884c\u6392\u5e8f\uff08\u672c\u6587\u91c7\u7528\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff09\uff1b
  3. \u6309\u7167\u6876\u7684\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\uff0c\u5408\u5e76\u7ed3\u679c\uff1b

Fig. \u6876\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint k = nums.length / 2;\nList<List<Float>> buckets = new ArrayList<>();\nfor (int i = 0; i < k; i++) {\nbuckets.add(new ArrayList<>());\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (float num : nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nint i = (int) num * k;\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets.get(i).add(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nCollections.sort(bucket);\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nint i = 0;\nfor (List<Float> bucket : buckets) {\nfor (float num : bucket) {\nnums[i++] = num;\n}\n}\n}\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\nint k = nums.size() / 2;\nvector<vector<float>> buckets(k);\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (float num : nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nint i = num * k;\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\nbuckets[i].push_back(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nsort(bucket.begin(), bucket.end());\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nint i = 0;\nfor (vector<float> &bucket : buckets) {\nfor (float num : bucket) {\nnums[i++] = num;\n}\n}\n}\n
bucket_sort.py
def bucket_sort(nums: list[float]) -> None:\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\nk = len(nums) // 2\nbuckets = [[] for _ in range(k)]\n# 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor num in nums:\n# \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\ni = int(num * k)\n# \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].append(num)\n# 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f5\nfor 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\nbucket.sort()\n# 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\ni = 0\nfor bucket in buckets:\nfor num in bucket:\nnums[i] = num\ni += 1\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\nk := len(nums) / 2\nbuckets := make([][]float64, k)\nfor i := 0; i < k; i++ {\nbuckets[i] = make([]float64, 0)\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor _, num := range nums {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\ni := int(num) * k\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i] = append(buckets[i], num)\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor 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\nsort.Float64s(buckets[i])\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\ni := 0\nfor _, bucket := range buckets {\nfor _, num := range bucket {\nnums[i] = num\ni++\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\nconst k = nums.length / 2;\nconst buckets = [];\nfor (let i = 0; i < k; i++) {\nbuckets.push([]);\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (const num of nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nconst i = Math.floor(num * k);\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].push(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nbucket.sort((a, b) => a - b);\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nlet i = 0;\nfor (const bucket of buckets) {\nfor (const num of bucket) {\nnums[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\nconst k = nums.length / 2;\nconst buckets: number[][] = [];\nfor (let i = 0; i < k; i++) {\nbuckets.push([]);\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (const num of nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nconst i = Math.floor(num * k);\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].push(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nbucket.sort((a, b) => a - b);\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nlet i = 0;\nfor (const bucket of buckets) {\nfor (const num of bucket) {\nnums[i++] = num;\n}\n}\n}\n
bucket_sort.c
[class]{}-[func]{bucketSort}\n
bucket_sort.cs
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums)\n{\n// \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\nint k = nums.Length / 2;\nList<List<float>> buckets = new List<List<float>>();\nfor (int i = 0; i < k; i++)\n{\nbuckets.Add(new List<float>());\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nforeach (float num in nums)\n{\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nint i = (int)num * k;\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].Add(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nforeach (List<float> bucket in buckets)\n{\n// \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\nbucket.Sort();\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nint j = 0;\nforeach (List<float> bucket in buckets)\n{\nforeach (float num in bucket)\n{\nnums[j++] = num;\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\nlet k = nums.count / 2\nvar buckets = (0 ..< k).map { _ in [Double]() }\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor num in nums {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nlet i = Int(num) * k\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].append(num)\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor 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\nbuckets[i].sort()\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nvar i = nums.startIndex\nfor bucket in buckets {\nfor num in bucket {\nnums[i] = num\nnums.formIndex(after: &i)\n}\n}\n}\n
bucket_sort.zig
[class]{}-[func]{bucketSort}\n

\u6876\u6392\u5e8f\u7684\u9002\u7528\u573a\u666f\u662f\u4ec0\u4e48\uff1f

\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

"},{"location":"chapter_sorting/bucket_sort/#1162","title":"11.6.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(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 \\(n\\) \u4e2a\u6876\uff0c\u82b1\u8d39 \\(O(k)\\) \u65f6\u95f4\u3002

\u5728\u6700\u574f\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\uff0c\u56e0\u6b64\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n + k)\\) \uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u5c5e\u4e8e\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\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/#1163","title":"11.6.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 \u4efd\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\u4e2a\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\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u521b\u5efa\u4e00\u4e2a\u9012\u5f52\u6811\uff0c\u4f7f\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

Fig. \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\u4e0b\u56fe\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

Fig. \u6839\u636e\u6982\u7387\u5206\u5e03\u5212\u5206\u6876

"},{"location":"chapter_sorting/counting_sort/","title":"11.7. \u00a0 \u8ba1\u6570\u6392\u5e8f","text":"

\u300c\u8ba1\u6570\u6392\u5e8f Counting Sort\u300d\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/#1171","title":"11.7.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\u3002\u8ba1\u6570\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a

  1. \u904d\u5386\u6570\u7ec4\uff0c\u627e\u51fa\u6570\u7ec4\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 \uff1b
  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\u88ab\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u904d\u5386 counter \uff0c\u6839\u636e\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\uff0c\u5c06\u5b83\u4eec\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

Fig. \u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint m = 0;\nfor (int num : nums) {\nm = 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\nint[] counter = new int[m + 1];\nfor (int num : nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++) {\nfor (int j = 0; j < counter[num]; j++, i++) {\nnums[i] = num;\n}\n}\n}\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\nint m = 0;\nfor (int num : nums) {\nm = 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\nvector<int> counter(m + 1, 0);\nfor (int num : nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++) {\nfor (int j = 0; j < counter[num]; j++, i++) {\nnums[i] = num;\n}\n}\n}\n
counting_sort.py
def counting_sort_naive(nums: list[int]) -> None:\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\nm = 0\nfor num in nums:\nm = 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\ncounter = [0] * (m + 1)\nfor num in nums:\ncounter[num] += 1\n# 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\ni = 0\nfor num in range(m + 1):\nfor _ in range(counter[num]):\nnums[i] = num\ni += 1\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\nm := 0\nfor num := range nums {\nif num > m {\nm = 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\ncounter := make([]int, m+1)\nfor _, num := range nums {\ncounter[num]++\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nfor i, num := 0, 0; num < m+1; num++ {\nfor j := 0; j < counter[num]; j++ {\nnums[i] = num\ni++\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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter = new Array(m + 1).fill(0);\nfor (const num of nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nlet i = 0;\nfor (let num = 0; num < m + 1; num++) {\nfor (let j = 0; j < counter[num]; j++, i++) {\nnums[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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter: number[] = new Array<number>(m + 1).fill(0);\nfor (const num of nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nlet i = 0;\nfor (let num = 0; num < m + 1; num++) {\nfor (let j = 0; j < counter[num]; j++, i++) {\nnums[i] = num;\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\nint m = 0;\nfor (int i = 0; i < size; i++) {\nif (nums[i] > m) {\nm = 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\nint *counter = malloc(sizeof(int) * size);\nfor (int i = 0; i < size; i++) {\ncounter[nums[i]]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++) {\nfor (int j = 0; j < counter[num]; j++, i++) {\nnums[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{\n// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in nums)\n{\nm = 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\nint[] counter = new int[m + 1];\nforeach (int num in nums)\n{\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++)\n{\nfor (int j = 0; j < counter[num]; j++, i++)\n{\nnums[i] = num;\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\nlet 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\nvar counter = Array(repeating: 0, count: m + 1)\nfor num in nums {\ncounter[num] += 1\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nvar i = 0\nfor num in stride(from: 0, to: m + 1, by: 1) {\nfor _ in stride(from: 0, to: counter[num], by: 1) {\nnums[i] = num\ni += 1\n}\n}\n}\n
counting_sort.zig
[class]{}-[func]{countingSortNaive}\n

\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\u662f\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/#1172","title":"11.7.2. \u00a0 \u5b8c\u6574\u5b9e\u73b0","text":"

\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u53d1\u73b0\uff0c\u5982\u679c\u8f93\u5165\u6570\u636e\u662f\u5bf9\u8c61\uff0c\u4e0a\u8ff0\u6b65\u9aa4 3. \u5c31\u5931\u6548\u4e86\u3002\u4f8b\u5982\uff0c\u8f93\u5165\u6570\u636e\u662f\u5546\u54c1\u5bf9\u8c61\uff0c\u6211\u4eec\u60f3\u8981\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\u300c\u524d\u7f00\u548c\u300d\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\uff0c\u5373

\\[ \\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\uff1a

  1. \u5c06 num \u586b\u5165\u6570\u7ec4 res \u7684\u7d22\u5f15 prefix[num] - 1 \u5904\uff1b
  2. \u4ee4\u524d\u7f00\u548c prefix[num] \u51cf\u5c0f \\(1\\) \uff0c\u4ece\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\uff1b

\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

<1><2><3><4><5><6><7><8>

\u8ba1\u6570\u6392\u5e8f\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint m = 0;\nfor (int num : nums) {\nm = 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\nint[] counter = new int[m + 1];\nfor (int num : nums) {\ncounter[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\nfor (int i = 0; i < m; i++) {\ncounter[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\nint n = nums.length;\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--) {\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (int i = 0; i < n; i++) {\nnums[i] = res[i];\n}\n}\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\nint m = 0;\nfor (int num : nums) {\nm = 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\nvector<int> counter(m + 1, 0);\nfor (int num : nums) {\ncounter[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\nfor (int i = 0; i < m; i++) {\ncounter[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\nint n = nums.size();\nvector<int> res(n);\nfor (int i = n - 1; i >= 0; i--) {\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nnums = res;\n}\n
counting_sort.py
def counting_sort(nums: list[int]) -> None:\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\nm = 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\ncounter = [0] * (m + 1)\nfor num in nums:\ncounter[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\nfor i in range(m):\ncounter[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\nn = len(nums)\nres = [0] * n\nfor i in range(n - 1, -1, -1):\nnum = nums[i]\nres[counter[num] - 1] = num  # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor i in range(n):\nnums[i] = res[i]\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\nm := 0\nfor num := range nums {\nif num > m {\nm = 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\ncounter := make([]int, m+1)\nfor _, num := range nums {\ncounter[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\nfor i := 0; i < m; i++ {\ncounter[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\nn := len(nums)\nres := make([]int, n)\nfor i := n - 1; i >= 0; i-- {\nnum := nums[i]\n// \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\nres[counter[num]-1] = num\n// \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\ncounter[num]--\n}\n// \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\ncopy(nums, res)\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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter = new Array(m + 1).fill(0);\nfor (const num of nums) {\ncounter[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\nfor (let i = 0; i < m; i++) {\ncounter[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\nconst n = nums.length;\nconst res = new Array(n);\nfor (let i = n - 1; i >= 0; i--) {\nconst num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (let i = 0; i < n; i++) {\nnums[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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter: number[] = new Array<number>(m + 1).fill(0);\nfor (const num of nums) {\ncounter[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\nfor (let i = 0; i < m; i++) {\ncounter[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\nconst n = nums.length;\nconst res: number[] = new Array<number>(n);\nfor (let i = n - 1; i >= 0; i--) {\nconst num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (let i = 0; i < n; i++) {\nnums[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\nint m = 0;\nfor (int i = 0; i < size; i++) {\nif (nums[i] > m) {\nm = 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\nint *counter = malloc(sizeof(int) * size);\nfor (int i = 0; i < size; i++) {\ncounter[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\nfor (int i = 0; i < m; i++) {\ncounter[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\nint *res = malloc(sizeof(int) * size);\nfor (int i = size - 1; i >= 0; i--) {\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nmemcpy(nums, res, size * sizeof(int));\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{\n// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in nums)\n{\nm = 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\nint[] counter = new int[m + 1];\nforeach (int num in nums)\n{\ncounter[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\nfor (int i = 0; i < m; i++)\n{\ncounter[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\nint n = nums.Length;\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--)\n{\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (int i = 0; i < n; i++)\n{\nnums[i] = res[i];\n}\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\nlet 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\nvar counter = Array(repeating: 0, count: m + 1)\nfor num in nums {\ncounter[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\nfor i in stride(from: 0, to: m, by: 1) {\ncounter[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\nvar res = Array(repeating: 0, count: nums.count)\nfor i in stride(from: nums.count - 1, through: 0, by: -1) {\nlet num = nums[i]\nres[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor i in stride(from: 0, to: nums.count, by: 1) {\nnums[i] = res[i]\n}\n}\n
counting_sort.zig
[class]{}-[func]{countingSort}\n
"},{"location":"chapter_sorting/counting_sort/#1173","title":"11.7.3. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n + m)\\) \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 \\(O(n + m)\\) \uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \uff0c\u56e0\u6b64\u662f\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\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\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\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\u201c\u975e\u7a33\u5b9a\u201d\u7684\u3002

"},{"location":"chapter_sorting/counting_sort/#1174","title":"11.7.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\u5de5\u4f5c\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\u8981\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\uff0c\u9700\u8981\u786e\u4fdd\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u88ab\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\u5373\u53ef\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/insertion_sort/","title":"11.3. \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

\u300c\u63d2\u5165\u6392\u5e8f Insertion Sort\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u6570\u7ec4\u63d2\u5165\u64cd\u4f5c\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u9009\u62e9\u4e00\u4e2a\u5f85\u6392\u5e8f\u7684\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u503c base \uff0c\u5c06 base \u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

\u56de\u987e\u6570\u7ec4\u63d2\u5165\u64cd\u4f5c\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\u518d\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

Fig. \u5355\u6b21\u63d2\u5165\u64cd\u4f5c

"},{"location":"chapter_sorting/insertion_sort/#1131","title":"11.3.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a

  1. \u9996\u5148\uff0c\u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  2. \u63a5\u7740\uff0c\u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6570\u7ec4\u5c3e\u5143\u7d20\u4f5c\u4e3a base \uff0c\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

Fig. \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig insertion_sort.java
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < nums.length; i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base;        // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
insertion_sort.cpp
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < nums.size(); i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
insertion_sort.py
def insertion_sort(nums: list[int]) -> None:\n\"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n# \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor i in range(1, len(nums)):\nbase: int = nums[i]\nj: int = i - 1\n# \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0 and nums[j] > base:\nnums[j + 1] = nums[j]  # 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\nnums[j + 1] = base  # 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n
insertion_sort.go
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := 1; i < len(nums); i++ {\nbase := nums[i]\nj := i - 1\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nfor j >= 0 && nums[j] > base {\nnums[j+1] = nums[j] // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--\n}\nnums[j+1] = base // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (let i = 1; i < nums.length; i++) {\nlet base = nums[i],\nj = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (let i = 1; i < nums.length; i++) {\nconst base = nums[i];\nlet j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < size; i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\n// 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nnums[j + 1] = nums[j];\nj--;\n}\n// 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\nnums[j + 1] = base;\n}\n}\n
insertion_sort.cs
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums)\n{\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < nums.Length; i++)\n{\nint bas = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > bas)\n{\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = bas;         // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor i in stride(from: 1, to: nums.count, by: 1) {\nlet base = nums[i]\nvar j = i - 1\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0, nums[j] > base {\nnums[j + 1] = nums[j] // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\n}\nnums[j + 1] = base // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
insertion_sort.zig
// \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nvar i: usize = 1;\nwhile (i < nums.len) : (i += 1) {\nvar base = nums[i];\nvar j: usize = i;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 1 and nums[j - 1] > base) : (j -= 1) {\nnums[j] = nums[j - 1];  // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n}\nnums[j] = base;             // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
"},{"location":"chapter_sorting/insertion_sort/#1132","title":"11.3.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n^2)\\) \uff1a\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u522b\u9700\u8981\u5faa\u73af \\(n - 1\\) , \\(n-2\\) , \\(\\cdots\\) , \\(2\\) , \\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\(\\frac{(n - 1) n}{2}\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \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)\\) \uff0c\u56e0\u6b64\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u6240\u4ee5\u63d2\u5165\u6392\u5e8f\u662f\u201c\u539f\u5730\u6392\u5e8f\u201d\u3002

\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\uff0c\u56e0\u6b64\u662f\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/insertion_sort/#1133","title":"11.3.3. \u00a0 \u63d2\u5165\u6392\u5e8f\u4f18\u52bf","text":"

\u56de\u987e\u5192\u6ce1\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u590d\u6742\u5ea6\u5206\u6790\uff0c\u4e24\u8005\u7684\u5faa\u73af\u8f6e\u6570\u90fd\u662f \\(\\frac{(n - 1) n}{2}\\) \u3002\u7136\u800c\uff0c\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4ee5\u4e0b\u5dee\u5f02\uff1a

  • \u5192\u6ce1\u64cd\u4f5c\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\u64cd\u4f5c\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b

\u7c97\u7565\u4f30\u8ba1\u4e0b\u6765\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u7ea6\u4e3a\u63d2\u5165\u6392\u5e8f\u7684 3 \u500d\uff0c\u56e0\u6b64\u63d2\u5165\u6392\u5e8f\u66f4\u53d7\u6b22\u8fce\u3002\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u5982 Java\uff09\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u90fd\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\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u4f8b\u5982\u300c\u5feb\u901f\u6392\u5e8f\u300d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \uff1b
  • \u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u300c\u63d2\u5165\u6392\u5e8f\u300d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff1b

\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\u4e8e\u5feb\u901f\u6392\u5e8f\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u5b9e\u9645\u4e0a\u66f4\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\uff08\u5373\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u64cd\u4f5c\u6570\u91cf\uff09\u8d77\u4e3b\u5bfc\u4f5c\u7528\u3002\u8fd9\u4e2a\u73b0\u8c61\u4e0e\u300c\u7ebf\u6027\u67e5\u627e\u300d\u548c\u300c\u4e8c\u5206\u67e5\u627e\u300d\u7684\u60c5\u51b5\u76f8\u4f3c\u3002

"},{"location":"chapter_sorting/merge_sort/","title":"11.5. \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

\u300c\u5f52\u5e76\u6392\u5e8f Merge Sort\u300d\u57fa\u4e8e\u5206\u6cbb\u601d\u60f3\u5b9e\u73b0\u6392\u5e8f\uff0c\u5305\u542b\u201c\u5212\u5206\u201d\u548c\u201c\u5408\u5e76\u201d\u4e24\u4e2a\u9636\u6bb5\uff1a

  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\uff1b
  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\uff1b

Fig. \u5f52\u5e76\u6392\u5e8f\u7684\u5212\u5206\u4e0e\u5408\u5e76\u9636\u6bb5

"},{"location":"chapter_sorting/merge_sort/#1151","title":"11.5.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u201c\u5212\u5206\u9636\u6bb5\u201d\u4ece\u9876\u81f3\u5e95\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5207\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u81f3\u957f\u5ea6\u4e3a 1 \uff1b

  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\uff1b
  2. \u9012\u5f52\u6267\u884c\u6b65\u9aa4 1. \uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u533a\u95f4\u957f\u5ea6\u4e3a 1 \u65f6\uff0c\u7ec8\u6b62\u9012\u5f52\u5212\u5206\uff1b

\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>

\u89c2\u5bdf\u53d1\u73b0\uff0c\u5f52\u5e76\u6392\u5e8f\u7684\u9012\u5f52\u987a\u5e8f\u4e0e\u4e8c\u53c9\u6811\u7684\u540e\u5e8f\u904d\u5386\u76f8\u540c\uff0c\u5177\u4f53\u6765\u770b\uff1a

  • \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
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig merge_sort.java
/* \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]\nvoid merge(int[] nums, int left, int mid, int right) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nint[] tmp = Arrays.copyOfRange(nums, left, right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++) {\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right)\nreturn;                      // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.cpp
/* \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]\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nvector<int> tmp(nums.begin() + left, nums.begin() + right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++) {\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right)\nreturn; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.py
def merge(nums: list[int], left: int, mid: int, right: int) -> None:\n\"\"\"\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]\n# \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\ntmp: list[int] = list(nums[left : right + 1])\n# \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nleft_start: int = 0\nleft_end: int = mid - left\n# \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nright_start: int = mid + 1 - left\nright_end: int = right - left\n# i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\ni: int = left_start\nj: int = right_start\n# \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor k in range(left, right + 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++\nif i > left_end:\nnums[k] = tmp[j]\nj += 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++\nelif j > right_end or tmp[i] <= tmp[j]:\nnums[k] = tmp[i]\ni += 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++\nelse:\nnums[k] = tmp[j]\nj += 1\ndef merge_sort(nums: list[int], left: int, right: int) -> None:\n\"\"\"\u5f52\u5e76\u6392\u5e8f\"\"\"\n# \u7ec8\u6b62\u6761\u4ef6\nif left >= right:\nreturn  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n# \u5212\u5206\u9636\u6bb5\nmid: int = (left + right) // 2  # \u8ba1\u7b97\u4e2d\u70b9\nmerge_sort(nums, left, mid)  # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmerge_sort(nums, mid + 1, right)  # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n# \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right)\n
merge_sort.go
/* \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]\nfunc merge(nums []int, left, mid, right int) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4 \u501f\u52a9 copy \u6a21\u5757\ntmp := make([]int, right-left+1)\nfor i := left; i <= right; i++ {\ntmp[i-left] = nums[i]\n}\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nleftStart, leftEnd := left-left, mid-left\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nrightStart, rightEnd := mid+1-left, right-left\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\ni, j := leftStart, rightStart\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor k := left; k <= right; k++ {\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++\nif i > leftEnd {\nnums[k] = tmp[j]\nj++\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 || tmp[i] <= tmp[j] {\nnums[k] = tmp[i]\ni++\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 {\nnums[k] = tmp[j]\nj++\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n// \u7ec8\u6b62\u6761\u4ef6\nif left >= right {\nreturn\n}\n// \u5212\u5206\u9636\u6bb5\nmid := (left + right) / 2\nmergeSort(nums, left, mid)\nmergeSort(nums, mid+1, right)\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right)\n}\n
merge_sort.js
/* \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]\nfunction merge(nums, left, mid, right) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nlet tmp = nums.slice(left, right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet leftStart = left - left,\nleftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet rightStart = mid + 1 - left,\nrightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nlet i = leftStart,\nj = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (let k = left; k <= right; k++) {\nif (i > leftEnd) {\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++\nnums[k] = tmp[j++];\n} else if (j > rightEnd || tmp[i] <= tmp[j]) {\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++\nnums[k] = tmp[i++];\n} else {\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++\nnums[k] = tmp[j++];\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nlet mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.ts
/* \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]\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nlet tmp = nums.slice(left, right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet leftStart = left - left,\nleftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet rightStart = mid + 1 - left,\nrightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nlet i = leftStart,\nj = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (let k = left; k <= right; k++) {\nif (i > leftEnd) {\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++\nnums[k] = tmp[j++];\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 || tmp[i] <= tmp[j]) {\nnums[k] = tmp[i++];\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 {\nnums[k] = tmp[j++];\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nlet mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.c
/* \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]\nvoid merge(int *nums, int left, int mid, int right) {\nint index;\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nint tmp[right + 1 - left];\nfor (index = left; index < right + 1; index++) {\ntmp[index - left] = nums[index];\n}\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++) {\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right)\nreturn; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.cs
/* \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]\nvoid merge(int[] nums, int left, int mid, int right)\n{\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nint[] tmp = nums[left..(right + 1)];\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15  \nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15       \nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++)\n{\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right)\n{\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return;       // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.swift
/* \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]\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nlet tmp = Array(nums[left ..< (right + 1)])\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet leftStart = left - left\nlet leftEnd = mid - left\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet rightStart = mid + 1 - left\nlet rightEnd = right - left\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nvar i = leftStart\nvar j = rightStart\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor k in left ... right {\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++\nif i > leftEnd {\nnums[k] = tmp[j]\nj += 1\n}\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++\nelse if j > rightEnd || tmp[i] <= tmp[j] {\nnums[k] = tmp[i]\ni += 1\n}\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++\nelse {\nnums[k] = tmp[j]\nj += 1\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n// \u7ec8\u6b62\u6761\u4ef6\nif left >= right { // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nreturn\n}\n// \u5212\u5206\u9636\u6bb5\nlet mid = (left + right) / 2 // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums: &nums, left: left, right: mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums: &nums, left: mid + 1, right: right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums: &nums, left: left, mid: mid, right: right)\n}\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\nvar mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\ndefer mem_arena.deinit();\nconst mem_allocator = mem_arena.allocator();\nvar tmp = try mem_allocator.alloc(i32, right + 1 - left);\nstd.mem.copy(i32, tmp, nums[left..right+1]);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15  \nvar leftStart = left - left;\nvar leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15       \nvar rightStart = mid + 1 - left;\nvar rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nvar i = leftStart;\nvar j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nvar k = left;\nwhile (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++\nif (i > leftEnd) {\nnums[k] = tmp[j];\nj += 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]) {\nnums[k] = tmp[i];\ni += 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 {\nnums[k] = tmp[j];\nj += 1;\n}\n}\n}\n// \u5f52\u5e76\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return;              // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nvar mid = (left + right) / 2;           // \u8ba1\u7b97\u4e2d\u70b9\ntry mergeSort(nums, left, mid);         // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\ntry mergeSort(nums, mid + 1, right);    // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\ntry merge(nums, left, mid, right);\n}\n

\u5408\u5e76\u65b9\u6cd5 merge() \u4ee3\u7801\u4e2d\u7684\u96be\u70b9\u5305\u62ec\uff1a

  • \u5728\u9605\u8bfb\u4ee3\u7801\u65f6\uff0c\u9700\u8981\u7279\u522b\u6ce8\u610f\u5404\u4e2a\u53d8\u91cf\u7684\u542b\u4e49\u3002nums \u7684\u5f85\u5408\u5e76\u533a\u95f4\u4e3a [left, right] \uff0c\u4f46\u7531\u4e8e tmp \u4ec5\u590d\u5236\u4e86 nums \u8be5\u533a\u95f4\u7684\u5143\u7d20\uff0c\u56e0\u6b64 tmp \u5bf9\u5e94\u533a\u95f4\u4e3a [0, right - left] \u3002
  • \u5728\u6bd4\u8f83 tmp[i] \u548c tmp[j] \u7684\u5927\u5c0f\u65f6\uff0c\u8fd8\u9700\u8003\u8651\u5b50\u6570\u7ec4\u904d\u5386\u5b8c\u6210\u540e\u7684\u7d22\u5f15\u8d8a\u754c\u95ee\u9898\uff0c\u5373 i > leftEnd \u548c j > rightEnd \u7684\u60c5\u51b5\u3002\u7d22\u5f15\u8d8a\u754c\u7684\u4f18\u5148\u7ea7\u662f\u6700\u9ad8\u7684\uff0c\u5982\u679c\u5de6\u5b50\u6570\u7ec4\u5df2\u7ecf\u88ab\u5408\u5e76\u5b8c\u4e86\uff0c\u90a3\u4e48\u4e0d\u9700\u8981\u7ee7\u7eed\u6bd4\u8f83\uff0c\u76f4\u63a5\u5408\u5e76\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u5373\u53ef\u3002
"},{"location":"chapter_sorting/merge_sort/#1152","title":"11.5.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \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 \\(O(n)\\) \uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\uff1b\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\uff1b\u56e0\u6b64\u662f\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\u3002

\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\uff0c\u56e0\u6b64\u5f52\u5e76\u6392\u5e8f\u662f\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/merge_sort/#1153","title":"11.5.3. \u00a0 \u94fe\u8868\u6392\u5e8f *","text":"

\u5f52\u5e76\u6392\u5e8f\u5728\u6392\u5e8f\u94fe\u8868\u65f6\u5177\u6709\u663e\u8457\u4f18\u52bf\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \uff0c\u539f\u56e0\u5982\u4e0b\uff1a

  • \u7531\u4e8e\u94fe\u8868\u4ec5\u9700\u6539\u53d8\u6307\u9488\u5c31\u53ef\u5b9e\u73b0\u8282\u70b9\u7684\u589e\u5220\u64cd\u4f5c\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\u9700\u521b\u5efa\u8f85\u52a9\u94fe\u8868\u3002
  • \u901a\u8fc7\u4f7f\u7528\u201c\u8fed\u4ee3\u5212\u5206\u201d\u66ff\u4ee3\u201c\u9012\u5f52\u5212\u5206\u201d\uff0c\u53ef\u7701\u53bb\u9012\u5f52\u4f7f\u7528\u7684\u6808\u5e27\u7a7a\u95f4\uff1b

\u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u67e5\u9605\u76f8\u5173\u8d44\u6599\u8fdb\u884c\u5b66\u4e60\u3002

"},{"location":"chapter_sorting/quick_sort/","title":"11.4. \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

\u300c\u5feb\u901f\u6392\u5e8f Quick Sort\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u601d\u60f3\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\u300c\u54e8\u5175\u5212\u5206\u300d\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\u4e3a\uff1a

  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\uff1b
  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\uff1b
  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\uff1b

\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

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

\u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u601d\u60f3

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig quick_sort.java
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j) {\nint tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cpp
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(vector<int> &nums, int i, int j) {\nint tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.py
def partition(self, nums: list[int], left: int, right: int) -> int:\n\"\"\"\u54e8\u5175\u5212\u5206\"\"\"\n# \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j = left, right\nwhile i < j:\nwhile i < j and nums[j] >= nums[left]:\nj -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile i < j and nums[i] <= nums[left]:\ni += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n# \u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n# \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.go
/* \u54e8\u5175\u5212\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j := left, right\nfor i < j {\nfor i < j && nums[j] >= nums[left] {\nj-- // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nfor i < j && nums[i] <= nums[left] {\ni++ // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n// \u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n}\n// \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u5143\u7d20\u4ea4\u6362 */\nswap(nums, i, j) {\nlet tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums, left, right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\nj -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile (i < j && nums[i] <= nums[left]) {\ni += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n// \u5143\u7d20\u4ea4\u6362\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn 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 {\nlet tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums: number[], left: number, right: number): number {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\nj -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile (i < j && nums[i] <= nums[left]) {\ni += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n// \u5143\u7d20\u4ea4\u6362\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b */\n// \u5feb\u901f\u6392\u5e8f\u7c7b-\u54e8\u5175\u5212\u5206\nint partition(int nums[], int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\n// \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nj--;\n}\nwhile (i < j && nums[i] <= nums[left]) {\n// \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\ni++;\n}\n// \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\nswap(nums, i, j);\n}\n// \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nswap(nums, i, left);\n// \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nreturn i;\n}\n
quick_sort.cs
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j)\n{\nint tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right)\n{\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j)\n{\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u5143\u7d20\u4ea4\u6362 */\nfunc swap(nums: inout [Int], i: Int, j: Int) {\nlet tmp = nums[i]\nnums[i] = nums[j]\nnums[j] = tmp\n}\n/* \u54e8\u5175\u5212\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nvar i = left\nvar j = right\nwhile i < j {\nwhile i < j, nums[j] >= nums[left] {\nj -= 1 // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile i < j, nums[i] <= nums[left] {\ni += 1 // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nswap(nums: &nums, i: i, j: j) // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums: &nums, i: i, j: left) // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.zig
// \u5143\u7d20\u4ea4\u6362\nfn swap(nums: []i32, i: usize, j: usize) void {\nvar tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n// \u54e8\u5175\u5212\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nvar i = left;\nvar j = right;\nwhile (i < j) {\nwhile (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
"},{"location":"chapter_sorting/quick_sort/#1141","title":"11.4.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"
  1. \u9996\u5148\uff0c\u5bf9\u539f\u6570\u7ec4\u6267\u884c\u4e00\u6b21\u300c\u54e8\u5175\u5212\u5206\u300d\uff0c\u5f97\u5230\u5f85\u6392\u5e8f\u7684\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\uff1b
  2. \u7136\u540e\uff0c\u5bf9\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5206\u522b\u9012\u5f52\u6267\u884c\u300c\u54e8\u5175\u5212\u5206\u300d\uff1b
  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\uff1b

Fig. \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nif (left >= right)\nreturn;\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\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\nif (left >= right)\nreturn;\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\n
quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int) -> None:\n\"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n# \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nif left >= right:\nreturn\n# \u54e8\u5175\u5212\u5206\npivot: int = self.partition(nums, left, right)\n# \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nself.quick_sort(nums, left, pivot - 1)\nself.quick_sort(nums, pivot + 1, right)\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\nif left >= right {\nreturn\n}\n// \u54e8\u5175\u5212\u5206\npivot := q.partition(nums, left, right)\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nq.quickSort(nums, left, pivot-1)\nq.quickSort(nums, pivot+1, 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\nif (left >= right) return;\n// \u54e8\u5175\u5212\u5206\nconst pivot = this.partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nthis.quickSort(nums, left, pivot - 1);\nthis.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\nif (left >= right) {\nreturn;\n}\n// \u54e8\u5175\u5212\u5206\nconst pivot = this.partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nthis.quickSort(nums, left, pivot - 1);\nthis.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b */\n// \u5feb\u901f\u6392\u5e8f\u7c7b-\u54e8\u5175\u5212\u5206\nint partition(int nums[], int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\n// \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nj--;\n}\nwhile (i < j && nums[i] <= nums[left]) {\n// \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\ni++;\n}\n// \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\nswap(nums, i, j);\n}\n// \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nswap(nums, i, left);\n// \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nreturn i;\n}\n// \u5feb\u901f\u6392\u5e8f\u7c7b-\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\nif (left >= right) {\nreturn;\n}\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right)\n{\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nif (left >= right)\nreturn;\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(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\nif left >= right {\nreturn\n}\n// \u54e8\u5175\u5212\u5206\nlet pivot = partition(nums: &nums, left: left, right: right)\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums: &nums, left: left, right: pivot - 1)\nquickSort(nums: &nums, left: pivot + 1, right: right)\n}\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\nif (left >= right) return;\n// \u54e8\u5175\u5212\u5206\nvar pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\n
"},{"location":"chapter_sorting/quick_sort/#1142","title":"11.4.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \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\\) \u5c42\uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\uff1b\u56e0\u6b64\u5feb\u901f\u6392\u5e8f\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \u3002\u7531\u4e8e\u672a\u4f7f\u7528\u8f85\u52a9\u6570\u7ec4\uff0c\u56e0\u6b64\u7b97\u6cd5\u662f\u201c\u539f\u5730\u6392\u5e8f\u201d\u3002

\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\uff0c\u56e0\u6b64\u662f\u201c\u975e\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/quick_sort/#1143","title":"11.4.3. \u00a0 \u5feb\u6392\u4e3a\u4ec0\u4e48\u5feb\uff1f","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\u300c\u5f52\u5e76\u6392\u5e8f\u300d\u548c\u300c\u5806\u6392\u5e8f\u300d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u539f\u56e0\u5982\u4e0b\uff1a

  • \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\u300c\u5806\u6392\u5e8f\u300d\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\u4f4e\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\u300c\u63d2\u5165\u6392\u5e8f\u300d\u6bd4\u300c\u5192\u6ce1\u6392\u5e8f\u300d\u66f4\u5feb\u7684\u539f\u56e0\u7c7b\u4f3c\u3002
"},{"location":"chapter_sorting/quick_sort/#1144","title":"11.4.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\u7684\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u90fd\u4e3a \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u4e3a\u300c\u5192\u6ce1\u6392\u5e8f\u300d\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig quick_sort.java
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\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\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cpp
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\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\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.py
def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n\"\"\"\u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\"\"\"\n# \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n# \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif (nums[left] < nums[mid]) ^ (nums[left] < nums[right]):\nreturn left\nelif (nums[mid] < nums[left]) ^ (nums[mid] < nums[right]):\nreturn mid\nreturn right\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] \u4f5c\u4e3a\u57fa\u51c6\u6570\nmed: int = self.median_three(nums, left, (left + right) // 2, right)\n# \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nnums[left], nums[med] = nums[med], nums[left]\n# \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j = left, right\nwhile i < j:\nwhile i < j and nums[j] >= nums[left]:\nj -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile i < j and nums[i] <= nums[left]:\ni += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n# \u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n# \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.go
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\uff08!= \u5728\u8fd9\u91cc\u8d77\u5230\u5f02\u6216\u7684\u4f5c\u7528\uff09\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif (nums[left] < nums[mid]) != (nums[left] < nums[right]) {\nreturn left\n} else if (nums[mid] < nums[left]) != (nums[mid] < nums[right]) {\nreturn mid\n}\nreturn right\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] \u4f5c\u4e3a\u57fa\u51c6\u6570\nmed := q.medianThree(nums, left, (left+right)/2, right)\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nnums[left], nums[med] = nums[med], nums[left]\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j := left, right\nfor i < j {\nfor i < j && nums[j] >= nums[left] {\nj-- //\u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nfor i < j && nums[i] <= nums[left] {\ni++ //\u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n//\u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n}\n//\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i //\u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(nums, left, mid, right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right])) return left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse return right;\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\nlet med = this.medianThree(\nnums,\nleft,\nMath.floor((left + right) / 2),\nright\n);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nthis.swap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(\nnums: number[],\nleft: number,\nmid: number,\nright: number\n): number {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif (Number(nums[left] < nums[mid]) ^ Number(nums[left] < nums[right])) {\nreturn left;\n} else if (\nNumber(nums[mid] < nums[left]) ^ Number(nums[mid] < nums[right])\n) {\nreturn mid;\n} else {\nreturn 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\nlet med = this.medianThree(\nnums,\nleft,\nMath.floor((left + right) / 2),\nright\n);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nthis.swap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile (i < j && nums[i] <= nums[left]) {\ni++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b\uff08\u4e2d\u4f4d\u57fa\u51c6\u6570\u4f18\u5316\uff09 */\n// \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nint medianThree(int nums[], int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\n}\n/* \u5feb\u901f\u6392\u5e8f\u7c7b\uff08\u4e2d\u4f4d\u57fa\u51c6\u6570\u4f18\u5316\uff09 */\n// \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nint medianThree(int nums[], int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\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\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right)\n{\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\n}\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right)\n{\n// \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j)\n{\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\nif (nums[left] < nums[mid]) != (nums[left] < nums[right]) {\nreturn left\n} else if (nums[mid] < nums[left]) != (nums[mid] < nums[right]) {\nreturn mid\n} else {\nreturn 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\nlet 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\nswap(nums: &nums, i: left, j: med)\nreturn partition(nums: &nums, left: left, right: right)\n}\n
quick_sort.zig
// \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) != (nums[left] < nums[right])) {\nreturn left;\n} else if ((nums[mid] < nums[left]) != (nums[mid] < nums[right])) {\nreturn mid;\n} else {\nreturn 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\nvar med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nvar i = left;\nvar j = right;\nwhile (i < j) {\nwhile (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
"},{"location":"chapter_sorting/quick_sort/#1145","title":"11.4.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\u5012\u5e8f\u7684\u8f93\u5165\u6570\u7ec4\u4e3a\u4f8b\uff0c\u7531\u4e8e\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \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 \\(\\frac{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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;                 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1;                 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int) -> None:\n\"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\"\"\"\n# \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\nwhile left < right:\n# \u54e8\u5175\u5212\u5206\u64cd\u4f5c\npivot: int = self.partition(nums, left, right)\n# \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif pivot - left < right - pivot:\nself.quick_sort(nums, left, pivot - 1)  # \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1  # \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\nelse:\nself.quick_sort(nums, pivot + 1, right)  # \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1  # \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\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\nfor left < right {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\npivot := q.partition(nums, left, right)\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif pivot-left < right-pivot {\nq.quickSort(nums, left, pivot-1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1                 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nq.quickSort(nums, pivot+1, right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1                 // \u5269\u4f59\u5f85\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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nlet pivot = this.partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nthis.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nthis.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nlet pivot = this.partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nthis.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nthis.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\n// \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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSortTailCall(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;                         // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSortTailCall(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1;                         // \u5269\u4f59\u5f85\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{\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\nwhile (left < right)\n{\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot)\n{\nquickSort(nums, left, pivot - 1);  // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;  // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n}\nelse\n{\nquickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\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) {\nvar left = left\nvar right = right\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\nwhile left < right {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nlet pivot = partition(nums: &nums, left: left, right: right)\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left) < (right - pivot) {\nquickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\nvar left = left_;\nvar right = right_;\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nvar pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSort(nums, left, pivot - 1);   // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;                   // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSort(nums, pivot + 1, right);  // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1;                  // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n

\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\u5c0f\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

"},{"location":"chapter_sorting/radix_sort/","title":"11.8. \u00a0 \u57fa\u6570\u6392\u5e8f","text":"

\u4e0a\u4e00\u8282\u6211\u4eec\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

\u300c\u57fa\u6570\u6392\u5e8f Radix Sort\u300d\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/#1181","title":"11.8.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\u6b65\u9aa4\u5982\u4e0b\uff1a

  1. \u521d\u59cb\u5316\u4f4d\u6570 \\(k = 1\\) \uff1b
  2. \u5bf9\u5b66\u53f7\u7684\u7b2c \\(k\\) \u4f4d\u6267\u884c\u300c\u8ba1\u6570\u6392\u5e8f\u300d\u3002\u5b8c\u6210\u540e\uff0c\u6570\u636e\u4f1a\u6839\u636e\u7b2c \\(k\\) \u4f4d\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\uff1b
  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\uff1b

Fig. \u57fa\u6570\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

\u4e0b\u9762\u6765\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 \\mod d \\]

\u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\mod d\\) \u8868\u793a\u5bf9 \\(d\\) \u53d6\u4f59\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nreturn (num / exp) % 10;\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\nint[] counter = new int[10];\nint n = nums.length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < n; i++) {\nint d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (int i = 1; i < 10; i++) {\ncounter[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\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--) {\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < n; i++)\nnums[i] = res[i];\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\nint m = Integer.MIN_VALUE;\nfor (int num : nums)\nif (num > m)\nm = num;\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, exp);\n}\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\nreturn (num / exp) % 10;\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\nvector<int> counter(10, 0);\nint n = nums.size();\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < n; i++) {\nint d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (int i = 1; i < 10; i++) {\ncounter[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\nvector<int> res(n, 0);\nfor (int i = n - 1; i >= 0; i--) {\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < n; i++)\nnums[i] = res[i];\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\nint m = *max_element(nums.begin(), nums.end());\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, exp);\n}\n
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\nreturn (num // exp) % 10\ndef counting_sort_digit(nums: list[int], exp: int) -> None:\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\ncounter = [0] * 10\nn = len(nums)\n# \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor i in range(n):\nd = digit(nums[i], exp)  # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor i in range(1, 10):\ncounter[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\nres = [0] * n\nfor i in range(n - 1, -1, -1):\nd = digit(nums[i], exp)\nj = counter[d] - 1  # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]  # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d] -= 1  # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n# \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor i in range(n):\nnums[i] = res[i]\ndef radix_sort(nums: list[int]) -> None:\n\"\"\"\u57fa\u6570\u6392\u5e8f\"\"\"\n# \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\nm = max(nums)\n# \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nexp = 1\nwhile 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)\ncounting_sort_digit(nums, exp)\nexp *= 10\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\nreturn (num / exp) % 10\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\ncounter := make([]int, 10)\nn := len(nums)\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor i := 0; i < n; i++ {\nd := digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor i := 1; i < 10; i++ {\ncounter[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\nres := make([]int, n)\nfor i := n - 1; i >= 0; i-- {\nd := digit(nums[i], exp)\nj := counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]    // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor i := 0; i < n; i++ {\nnums[i] = res[i]\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\nmax := math.MinInt\nfor _, num := range nums {\nif num > max {\nmax = num\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor 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)\ncountingSortDigit(nums, 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\nreturn Math.floor(num / exp) % 10;\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\nconst counter = new Array(10).fill(0);\nconst n = nums.length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (let i = 0; i < n; i++) {\nconst d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (let i = 1; i < 10; i++) {\ncounter[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\nconst res = new Array(n).fill(0);\nfor (let i = n - 1; i >= 0; i--) {\nconst d = digit(nums[i], exp);\nconst j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (let i = 0; i < n; i++) {\nnums[i] = res[i];\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\nlet m = Number.MIN_VALUE;\nfor (const num of nums) {\nif (num > m) {\nm = num;\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(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\nreturn Math.floor(num / exp) % 10;\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\nconst counter = new Array(10).fill(0);\nconst n = nums.length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (let i = 0; i < n; i++) {\nconst d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (let i = 1; i < 10; i++) {\ncounter[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\nconst res = new Array(n).fill(0);\nfor (let i = n - 1; i >= 0; i--) {\nconst d = digit(nums[i], exp);\nconst j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (let i = 0; i < n; i++) {\nnums[i] = res[i];\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\nlet m = Number.MIN_VALUE;\nfor (const num of nums) {\nif (num > m) {\nm = num;\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, exp);\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\nreturn (num / exp) % 10;\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\nint *counter = (int *)malloc((sizeof(int) * 10));\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < size; i++) {\n// \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\nint d = digit(nums[i], exp);\n// \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\ncounter[d]++;\n}\n// \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\nfor (int i = 1; i < 10; i++) {\ncounter[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\nint *res = (int *)malloc(sizeof(int) * size);\nfor (int i = size - 1; i >= 0; i--) {\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < size; i++) {\nnums[i] = res[i];\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\nint max = INT32_MIN;\nfor (size_t i = 0; i < size - 1; i++) {\nif (nums[i] > max) {\nmax = nums[i];\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, size, exp);\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{\n// \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\nreturn (num / exp) % 10;\n}\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp)\n{\n// \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\nint[] counter = new int[10];\nint n = nums.Length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < n; i++)\n{\nint d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (int i = 1; i < 10; i++)\n{\ncounter[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\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--)\n{\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < n; i++)\n{\nnums[i] = res[i];\n}\n}\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int[] nums)\n{\n// \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\nint m = int.MinValue;\nforeach (int num in nums)\n{\nif (num > m) m = num;\n}               // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (int exp = 1; exp <= m; exp *= 10)\n{\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)\ncountingSortDigit(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/* \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\nvar counter = Array(repeating: 0, count: 10)\nlet n = nums.count\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor i in nums.indices {\nlet d = digit(num: nums[i], exp: exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor i in 1 ..< 10 {\ncounter[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\nvar res = Array(repeating: 0, count: n)\nfor i in stride(from: n - 1, through: 0, by: -1) {\nlet d = digit(num: nums[i], exp: exp)\nlet j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i] // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d] -= 1 // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor i in nums.indices {\nnums[i] = res[i]\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\nvar m = Int.min\nfor num in nums {\nif num > m {\nm = num\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor 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)\ncountingSortDigit(nums: &nums, exp: exp)\n}\n}\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\nreturn @mod(@divFloor(num, exp), 10);\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\nvar mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n// defer mem_arena.deinit();\nconst mem_allocator = mem_arena.allocator();\nvar counter = try mem_allocator.alloc(usize, 10);\nstd.mem.set(usize, counter, 0);\nvar n = nums.len;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (nums) |num| {\nvar d = @bitCast(u32, digit(num, exp)); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nvar i: usize = 1;\nwhile (i < 10) : (i += 1) {\ncounter[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\nvar res = try mem_allocator.alloc(i32, n);\ni = n - 1;\nwhile (i >= 0) : (i -= 1) {\nvar d = @bitCast(u32, digit(nums[i], exp));\nvar j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d] -= 1;        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\nif (i == 0) break;\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\ni = 0;\nwhile (i < n) : (i += 1) {\nnums[i] = res[i];\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\nvar m: i32 = std.math.minInt(i32);\nfor (nums) |num| {\nif (num > m) m = num;\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nvar exp: i32 = 1;\nwhile (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)\ntry countingSortDigit(nums, exp);    }\n} 

\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\u6211\u4eec\u5e94\u8be5\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

"},{"location":"chapter_sorting/radix_sort/#1182","title":"11.8.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk)\\) \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 \\(O(n + d)\\) \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 \uff0c\u56e0\u6b64\u5b83\u662f\u4e00\u79cd\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\u3002

\u57fa\u6570\u6392\u5e8f\u4e0e\u8ba1\u6570\u6392\u5e8f\u4e00\u6837\uff0c\u90fd\u5c5e\u4e8e\u7a33\u5b9a\u6392\u5e8f\u3002\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

"},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1. \u00a0 \u6392\u5e8f\u7b97\u6cd5","text":"

\u300c\u6392\u5e8f\u7b97\u6cd5 Sorting Algorithm\u300d\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\u6709\u6548\u5730\u67e5\u627e\u3001\u5206\u6790\u548c\u5904\u7406\u3002

\u5728\u6392\u5e8f\u7b97\u6cd5\u4e2d\uff0c\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u6216\u5b57\u7b26\u4e32\u7b49\uff1b\u987a\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

Fig. \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\u5373\u65f6\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u964d\u4f4e\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u91cf\u60c5\u51b5\uff0c\u8fd0\u884c\u6548\u7387\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002

\u5c31\u5730\u6027\uff1a\u987e\u540d\u601d\u4e49\uff0c\u300c\u539f\u5730\u6392\u5e8f\u300d\u901a\u8fc7\u5728\u539f\u6570\u7ec4\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\uff0c\u65e0\u9700\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\u300c\u7a33\u5b9a\u6392\u5e8f\u300d\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\u4f18\u826f\u7279\u6027\uff0c\u4e5f\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, 2 \u5217\u5206\u522b\u662f\u59d3\u540d\u548c\u5e74\u9f84\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u300c\u975e\u7a33\u5b9a\u6392\u5e8f\u300d\u53ef\u80fd\u5bfc\u81f4\u8f93\u5165\u6570\u636e\u7684\u6709\u5e8f\u6027\u4e27\u5931\u3002

# \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# \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\u300c\u81ea\u9002\u5e94\u6392\u5e8f\u300d\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u53d7\u8f93\u5165\u6570\u636e\u7684\u5f71\u54cd\uff0c\u5373\u6700\u4f73\u3001\u6700\u5dee\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\u300c\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u300d\u4f9d\u8d56\u4e8e\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\\(<\\) , \\(=\\) , \\(>\\)\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\u300c\u975e\u6bd4\u8f83\u6392\u5e8f\u300d\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.9. \u00a0 \u5c0f\u7ed3","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\u5f85\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\u5b83\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

Fig. \u6392\u5e8f\u7b97\u6cd5\u5bf9\u6bd4

  • \u603b\u4f53\u6765\u770b\uff0c\u6211\u4eec\u8ffd\u6c42\u8fd0\u884c\u5feb\u3001\u7a33\u5b9a\u3001\u539f\u5730\u3001\u6b63\u5411\u81ea\u9002\u5e94\u6027\u7684\u6392\u5e8f\u3002\u663e\u7136\uff0c\u5982\u540c\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e00\u6837\uff0c\u540c\u65f6\u6ee1\u8db3\u8fd9\u4e9b\u6761\u4ef6\u7684\u6392\u5e8f\u7b97\u6cd5\u5e76\u4e0d\u5b58\u5728\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u95ee\u9898\u7279\u70b9\u6765\u9009\u62e9\u6392\u5e8f\u7b97\u6cd5\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
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3. \u00a0 \u53cc\u5411\u961f\u5217","text":"

\u5bf9\u4e8e\u961f\u5217\uff0c\u6211\u4eec\u4ec5\u80fd\u5728\u5934\u90e8\u5220\u9664\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u3002\u7136\u800c\uff0c\u300c\u53cc\u5411\u961f\u5217 Deque\u300d\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

Fig. \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\u4e0b\u8868\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

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 pushFirst() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u9996 \\(O(1)\\) pushLast() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) popFirst() \u5220\u9664\u961f\u9996\u5143\u7d20 \\(O(1)\\) popLast() \u5220\u9664\u961f\u5c3e\u5143\u7d20 \\(O(1)\\) peekFirst() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\) peekLast() \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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig deque.java
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nDeque<Integer> deque = new LinkedList<>();\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/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u961f\u5c3e\u5143\u7d20\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/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
deque.cpp
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\ndeque<int> deque;\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/* \u8bbf\u95ee\u5143\u7d20 */\nint front = deque.front(); // \u961f\u9996\u5143\u7d20\nint back = deque.back();   // \u961f\u5c3e\u5143\u7d20\n/* \u5143\u7d20\u51fa\u961f */\ndeque.pop_front();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.pop_back();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = deque.empty();\n
deque.py
# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\ndeque: Deque[int] = collections.deque()\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# \u8bbf\u95ee\u5143\u7d20\nfront: int = deque[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u961f\u5c3e\u5143\u7d20\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# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deque)\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deque) == 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/* \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/* \u8bbf\u95ee\u5143\u7d20 */\nfront := deque.Front() // \u961f\u9996\u5143\u7d20\nrear := deque.Back()   // \u961f\u5c3e\u5143\u7d20\n/* \u5143\u7d20\u51fa\u961f */\ndeque.Remove(front)    // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.Remove(rear)     // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize := deque.Len()\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := deque.Len() == 0\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/* \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);\nconsole.log(\"\u53cc\u5411\u961f\u5217 deque = \", deque);\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst = deque[0];\nconsole.log(\"\u961f\u9996\u5143\u7d20 peekFirst = \" + peekFirst);\nconst peekLast = deque[deque.length - 1];\nconsole.log(\"\u961f\u5c3e\u5143\u7d20 peekLast = \" + peekLast);\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();\nconsole.log(\"\u961f\u9996\u51fa\u961f\u5143\u7d20 popFront = \" + popFront + \"\uff0c\u961f\u9996\u51fa\u961f\u540e deque = \" + deque);\nconst popBack = deque.pop();\nconsole.log(\"\u961f\u5c3e\u51fa\u961f\u5143\u7d20 popBack = \" + popBack + \"\uff0c\u961f\u5c3e\u51fa\u961f\u540e deque = \" + deque);\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = deque.length;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u957f\u5ea6 size = \" + size);\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty = size === 0;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a = \" + isEmpty);\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/* \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);\nconsole.log(\"\u53cc\u5411\u961f\u5217 deque = \", deque);\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconsole.log(\"\u961f\u9996\u5143\u7d20 peekFirst = \" + peekFirst);\nconst peekLast: number = deque[deque.length - 1];\nconsole.log(\"\u961f\u5c3e\u5143\u7d20 peekLast = \" + peekLast);\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;\nconsole.log(\"\u961f\u9996\u51fa\u961f\u5143\u7d20 popFront = \" + popFront + \"\uff0c\u961f\u9996\u51fa\u961f\u540e deque = \" + deque);\nconst popBack: number = deque.pop() as number;\nconsole.log(\"\u961f\u5c3e\u51fa\u961f\u5143\u7d20 popBack = \" + popBack + \"\uff0c\u961f\u5c3e\u51fa\u961f\u540e deque = \" + deque);\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size: number = deque.length;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u957f\u5ea6 size = \" + size);\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty: boolean = size === 0;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a = \" + isEmpty);\n
deque.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u53cc\u5411\u961f\u5217\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 LinkedList<int>();\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/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u961f\u5c3e\u5143\u7d20\n/* \u5143\u7d20\u51fa\u961f */\ndeque.RemoveFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.RemoveLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.Count;\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.Count == 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/* \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/* \u8bbf\u95ee\u5143\u7d20 */\nlet peekFirst = deque.first! // \u961f\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u961f\u5c3e\u5143\u7d20\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/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.count\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = deque.isEmpty\n
deque.zig
\n
"},{"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":"\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\u300c\u53cc\u5411\u94fe\u8868\u300d\u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

\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

LinkedListDequepushLast()pushFirst()popLast()popFirst()

\u4ee5\u4e0b\u662f\u5177\u4f53\u5b9e\u73b0\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linkedlist_deque.java
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nint val; // \u8282\u70b9\u503c\nListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nListNode(int val) {\nthis.val = val;\nprev = next = null;\n}\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nprivate int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npublic LinkedListDeque() {\nfront = rear = null;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f\u64cd\u4f5c */\nprivate void push(int num, boolean isFront) {\nListNode node = new ListNode(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (isEmpty())\nfront = rear = node;\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if (isFront) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nfront.prev = node;\nnode.next = front;\nfront = 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\nrear.next = node;\nnode.prev = rear;\nrear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\npublic void pushFirst(int num) {\npush(num, true);\n}\n/* \u961f\u5c3e\u5165\u961f */\npublic void pushLast(int num) {\npush(num, false);\n}\n/* \u51fa\u961f\u64cd\u4f5c */\nprivate Integer pop(boolean isFront) {\n// \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\nif (isEmpty())\nreturn null;\nint val;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (isFront) {\nval = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nListNode fNext = front.next;\nif (fNext != null) {\nfNext.prev = null;\nfront.next = null;\n}\nfront = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n} else {\nval = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nListNode rPrev = rear.prev;\nif (rPrev != null) {\nrPrev.next = null;\nrear.prev = null;\n}\nrear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n}\n/* \u961f\u9996\u51fa\u961f */\npublic Integer popFirst() {\nreturn pop(true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\npublic Integer popLast() {\nreturn pop(false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic Integer peekFirst() {\nreturn isEmpty() ? null : front.val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic Integer peekLast() {\nreturn isEmpty() ? null : rear.val;\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\npublic int[] toArray() {\nListNode node = front;\nint[] res = new int[size()];\nfor (int i = 0; i < res.length; i++) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_deque.cpp
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\nint val;              // \u8282\u70b9\u503c\nDoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\nDoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\nDoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n}\n};\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate:\nDoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nint queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nLinkedListDeque() : front(nullptr), rear(nullptr) {\n}\n/* \u6790\u6784\u65b9\u6cd5 */\n~LinkedListDeque() {\n// \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\nDoublyListNode *pre, *cur = front;\nwhile (cur != nullptr) {\npre = cur;\ncur = cur->next;\ndelete pre;\n}\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f\u64cd\u4f5c */\nvoid push(int num, bool isFront) {\nDoublyListNode *node = new DoublyListNode(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (isEmpty())\nfront = rear = node;\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if (isFront) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nfront->prev = node;\nnode->next = front;\nfront = 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\nrear->next = node;\nnode->prev = rear;\nrear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(int num) {\npush(num, true);\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(int num) {\npush(num, false);\n}\n/* \u51fa\u961f\u64cd\u4f5c */\nint pop(bool isFront) {\n// \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de -1\nif (isEmpty())\nreturn -1;\nint val;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (isFront) {\nval = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nDoublyListNode *fNext = front->next;\nif (fNext != nullptr) {\nfNext->prev = nullptr;\nfront->next = nullptr;\ndelete front;\n}\nfront = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n} else {\nval = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nDoublyListNode *rPrev = rear->prev;\nif (rPrev != nullptr) {\nrPrev->next = nullptr;\nrear->prev = nullptr;\ndelete rear;\n}\nrear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst() {\nreturn pop(true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast() {\nreturn pop(false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst() {\nreturn isEmpty() ? -1 : front->val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast() {\nreturn isEmpty() ? -1 : rear->val;\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nvector<int> toVector() {\nDoublyListNode *node = front;\nvector<int> res(size());\nfor (int i = 0; i < res.size(); i++) {\nres[i] = node->val;\nnode = node->next;\n}\nreturn res;\n}\n};\n
linkedlist_deque.py
class ListNode:\n\"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\ndef __init__(self, val: int) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.val: int = val\nself.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nself.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nclass LinkedListDeque:\n\"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\ndef __init__(self) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.front: ListNode | None = None  # \u5934\u8282\u70b9 front\nself.rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\nself.__size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.size() == 0\ndef push(self, num: int, is_front: bool) -> None:\n\"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\nnode = ListNode(num)\n# \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif self.is_empty():\nself.front = self.rear = node\n# \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelif is_front:\n# \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nself.front.prev = node\nnode.next = self.front\nself.front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n# \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\nelse:\n# \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nself.rear.next = node\nnode.prev = self.rear\nself.rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\nself.__size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\ndef push_first(self, num: int) -> None:\n\"\"\"\u961f\u9996\u5165\u961f\"\"\"\nself.push(num, True)\ndef push_last(self, num: int) -> None:\n\"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\nself.push(num, False)\ndef pop(self, is_front: bool) -> int:\n\"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n# \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\nif self.is_empty():\nreturn None\n# \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif is_front:\nval: int = self.front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n# \u5220\u9664\u5934\u8282\u70b9\nfnext: ListNode | None = self.front.next\nif fnext != None:\nfnext.prev = None\nself.front.next = None\nself.front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n# \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse:\nval: int = self.rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n# \u5220\u9664\u5c3e\u8282\u70b9\nrprev: ListNode | None = self.rear.prev\nif rprev != None:\nrprev.next = None\nself.rear.prev = None\nself.rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\nself.__size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val\ndef pop_first(self) -> int:\n\"\"\"\u961f\u9996\u51fa\u961f\"\"\"\nreturn self.pop(True)\ndef pop_last(self) -> int:\n\"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\nreturn self.pop(False)\ndef peek_first(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nreturn None if self.is_empty() else self.front.val\ndef peek_last(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\nreturn None if self.is_empty() else self.rear.val\ndef to_array(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\nnode: ListNode | None = self.front\nres: list[int] = [0] * self.size()\nfor i in range(self.size()):\nres[i] = node.val\nnode = node.next\nreturn res\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\ndata *list.List\n}\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\nreturn &linkedListDeque{\ndata: list.New(),\n}\n}\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\ns.data.PushFront(value)\n}\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\ns.data.PushBack(value)\n}\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\nreturn e.Value\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\nreturn e.Value\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\nreturn s.data.Len()\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\nreturn s.data.Len() == 0\n}\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\nreturn s.data\n}\n
linkedlist_deque.js
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nprev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nnext; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nval; // \u8282\u70b9\u503c\nconstructor(val) {\nthis.val = val;\nthis.next = null;\nthis.prev = null;\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\nconstructor() {\nthis.#front = null;\nthis.#rear = null;\nthis.#queSize = 0;\n}\n/* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\npushLast(val) {\nconst node = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.#queSize === 0) {\nthis.#front = node;\nthis.#rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nthis.#rear.next = node;\nnode.prev = this.#rear;\nthis.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nthis.#queSize++;\n}\n/* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\npushFirst(val) {\nconst node = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.#queSize === 0) {\nthis.#front = node;\nthis.#rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nthis.#front.prev = node;\nnode.next = this.#front;\nthis.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n}\nthis.#queSize++;\n}\n/* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\npopLast() {\nif (this.#queSize === 0) {\nreturn null;\n}\nconst value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nlet temp = this.#rear.prev;\nif (temp !== null) {\ntemp.next = null;\nthis.#rear.prev = null;\n}\nthis.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\nthis.#queSize--;\nreturn value;\n}\n/* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\npopFirst() {\nif (this.#queSize === 0) {\nreturn null;\n}\nconst value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nlet temp = this.#front.next;\nif (temp !== null) {\ntemp.prev = null;\nthis.#front.next = null;\n}\nthis.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\nthis.#queSize--;\nreturn value;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast() {\nreturn this.#queSize === 0 ? null : this.#rear.val;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst() {\nreturn this.#queSize === 0 ? null : this.#front.val;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.#queSize === 0;\n}\n/* \u6253\u5370\u53cc\u5411\u961f\u5217 */\nprint() {\nconst arr = [];\nlet temp = this.#front;\nwhile (temp !== null) {\narr.push(temp.val);\ntemp = temp.next;\n}\nconsole.log('[' + arr.join(', ') + ']');\n}\n}\n
linkedlist_deque.ts
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nprev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nnext: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nval: number; // \u8282\u70b9\u503c\nconstructor(val: number) {\nthis.val = val;\nthis.next = null;\nthis.prev = null;\n}\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate front: ListNode; // \u5934\u8282\u70b9 front\nprivate rear: ListNode; // \u5c3e\u8282\u70b9 rear\nprivate queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nconstructor() {\nthis.front = null;\nthis.rear = null;\nthis.queSize = 0;\n}\n/* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\npushLast(val: number): void {\nconst node: ListNode = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.queSize === 0) {\nthis.front = node;\nthis.rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nthis.rear.next = node;\nnode.prev = this.rear;\nthis.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nthis.queSize++;\n}\n/* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\npushFirst(val: number): void {\nconst node: ListNode = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.queSize === 0) {\nthis.front = node;\nthis.rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nthis.front.prev = node;\nnode.next = this.front;\nthis.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n}\nthis.queSize++;\n}\n/* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\npopLast(): number {\nif (this.queSize === 0) {\nreturn null;\n}\nconst value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nlet temp: ListNode = this.rear.prev;\nif (temp !== null) {\ntemp.next = null;\nthis.rear.prev = null;\n}\nthis.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\nthis.queSize--;\nreturn value;\n}\n/* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\npopFirst(): number {\nif (this.queSize === 0) {\nreturn null;\n}\nconst value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nlet temp: ListNode = this.front.next;\nif (temp !== null) {\ntemp.prev = null;\nthis.front.next = null;\n}\nthis.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\nthis.queSize--;\nreturn value;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast(): number {\nreturn this.queSize === 0 ? null : this.rear.val;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst(): number {\nreturn this.queSize === 0 ? null : this.front.val;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.queSize === 0;\n}\n/* \u6253\u5370\u53cc\u5411\u961f\u5217 */\nprint(): void {\nconst arr: number[] = [];\nlet temp: ListNode = this.front;\nwhile (temp !== null) {\narr.push(temp.val);\ntemp = temp.next;\n}\nconsole.log('[' + arr.join(', ') + ']');\n}\n}\n
linkedlist_deque.c
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct doublyListNode {\nint val;                     // \u8282\u70b9\u503c\nstruct doublyListNode *next; // \u540e\u7ee7\u8282\u70b9\nstruct doublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n};\n/* \u6784\u9020\u51fd\u6570 */\ndoublyListNode *newDoublyListNode(int num) {\ndoublyListNode *new = (doublyListNode *)malloc(sizeof(doublyListNode));\nnew->val = num;\nnew->next = NULL;\nnew->prev = NULL;\nreturn new;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(doublyListNode *node) {\nfree(node);\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct linkedListDeque {\ndoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nint queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n};\n/* \u6784\u9020j */\nlinkedListDeque *newLinkedListDeque() {\nlinkedListDeque *deque = (linkedListDeque *)malloc(sizeof(linkedListDeque));\ndeque->front = NULL;\ndeque->rear = NULL;\ndeque->queSize = 0;\nreturn deque;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(linkedListDeque *deque) {\n// \u91ca\u653e\u6240\u6709\u8282\u70b9\nfor (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\ndoublyListNode *tmp = deque->front;\ndeque->front = deque->front->next;\nfree(tmp);\n}\n// \u91ca\u653e deque \u7ed3\u6784\u4f53\nfree(deque);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(linkedListDeque *deque) {\nreturn deque->queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(linkedListDeque *deque) {\nreturn (size(deque) == 0);\n}\n/* \u5165\u961f */\nvoid push(linkedListDeque *deque, int num, bool isFront) {\ndoublyListNode *node = newDoublyListNode(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411node\nif (empty(deque)) {\ndeque->front = deque->rear = node;\n}\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if (isFront) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\ndeque->front->prev = node;\nnode->next = deque->front;\ndeque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u5bf9\u5c3e\u5165\u961f\u64cd\u4f5c\nelse {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\ndeque->rear->next = node;\nnode->prev = deque->rear;\ndeque->rear = node;\n}\ndeque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(linkedListDeque *deque, int num) {\npush(deque, num, true);\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(linkedListDeque *deque, int num) {\npush(deque, num, false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(linkedListDeque *deque) {\nassert(size(deque) && deque->front);\nreturn deque->front->val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(linkedListDeque *deque) {\nassert(size(deque) && deque->rear);\nreturn deque->rear->val;\n}\n/* \u51fa\u961f */\nint pop(linkedListDeque *deque, bool isFront) {\nif (empty(deque))\nreturn -1;\nint val;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (isFront) {\nval = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\ndoublyListNode *fNext = deque->front->next;\nif (fNext) {\nfNext->prev = NULL;\ndeque->front->next = NULL;\ndelDoublyListNode(deque->front);\n}\ndeque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse {\nval = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\ndoublyListNode *rPrev = deque->rear->prev;\nif (rPrev) {\nrPrev->next = NULL;\ndeque->rear->prev = NULL;\ndelDoublyListNode(deque->rear);\n}\ndeque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\ndeque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(linkedListDeque *deque) {\nreturn pop(deque, true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(linkedListDeque *deque) {\nreturn pop(deque, false);\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(linkedListDeque *deque) {\nint arr[deque->queSize];\n// \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\nint i;\ndoublyListNode *node;\nfor (i = 0, node = deque->front; i < deque->queSize; i++) {\narr[i] = node->val;\nnode = node->next;\n}\nprintArray(arr, deque->queSize);\n}\n
linkedlist_deque.cs
[class]{ListNode}-[func]{}\n[class]{LinkedListDeque}-[func]{}\n
linkedlist_deque.swift
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nvar val: Int // \u8282\u70b9\u503c\nvar next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nvar prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\ninit(val: Int) {\nself.val = val\n}\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate var front: ListNode? // \u5934\u8282\u70b9 front\nprivate var rear: ListNode? // \u5c3e\u8282\u70b9 rear\nprivate var queSize: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\ninit() {\nqueSize = 0\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nqueSize\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u5165\u961f\u64cd\u4f5c */\nprivate func push(num: Int, isFront: Bool) {\nlet node = ListNode(val: num)\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif isEmpty() {\nfront = node\nrear = node\n}\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if isFront {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nfront?.prev = node\nnode.next = front\nfront = node // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\nelse {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nrear?.next = node\nnode.prev = rear\nrear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\nfunc pushFirst(num: Int) {\npush(num: num, isFront: true)\n}\n/* \u961f\u5c3e\u5165\u961f */\nfunc pushLast(num: Int) {\npush(num: num, isFront: false)\n}\n/* \u51fa\u961f\u64cd\u4f5c */\nprivate func pop(isFront: Bool) -> Int {\nif isEmpty() {\nfatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n}\nlet val: Int\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif isFront {\nval = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nlet fNext = front?.next\nif fNext != nil {\nfNext?.prev = nil\nfront?.next = nil\n}\nfront = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse {\nval = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nlet rPrev = rear?.prev\nif rPrev != nil {\nrPrev?.next = nil\nrear?.prev = nil\n}\nrear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val\n}\n/* \u961f\u9996\u51fa\u961f */\nfunc popFirst() -> Int {\npop(isFront: true)\n}\n/* \u961f\u5c3e\u51fa\u961f */\nfunc popLast() -> Int {\npop(isFront: false)\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peekFirst() -> Int? {\nisEmpty() ? nil : front?.val\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc peekLast() -> Int? {\nisEmpty() ? nil : rear?.val\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nfunc toArray() -> [Int] {\nvar node = front\nvar res = Array(repeating: 0, count: size())\nfor i in res.indices {\nres[i] = node!.val\nnode = node?.next\n}\nreturn res\n}\n}\n
linkedlist_deque.zig
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nval: T = undefined,     // \u8282\u70b9\u503c\nnext: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nprev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\n// Initialize a list node with specific value\npub fn init(self: *Self, x: i32) void {\nself.val = x;\nself.next = null;\nself.prev = null;\n}\n};\n}\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nfront: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\nrear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\nque_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.front = null;\nself.rear = null;\nself.que_size = 0;\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.que_size;\n}\n// \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u5165\u961f\u64cd\u4f5c\npub fn push(self: *Self, num: T, is_front: bool) !void {\nvar node = try self.mem_allocator.create(ListNode(T));\nnode.init(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (self.isEmpty()) {\nself.front = node;\nself.rear = node;\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\n} else if (is_front) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nself.front.?.prev = node;\nnode.next = self.front;\nself.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\nself.rear.?.next = node;\nnode.prev = self.rear;\nself.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nself.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n} // \u961f\u9996\u5165\u961f\npub fn pushFirst(self: *Self, num: T) !void {\ntry self.push(num, true);\n} // \u961f\u5c3e\u5165\u961f\npub fn pushLast(self: *Self, num: T) !void {\ntry self.push(num, false);\n} // \u51fa\u961f\u64cd\u4f5c\npub fn pop(self: *Self, is_front: bool) T {\nif (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nvar val: T = undefined;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (is_front) {\nval = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nvar fNext = self.front.?.next;\nif (fNext != null) {\nfNext.?.prev = null;\nself.front.?.next = null;\n}\nself.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n} else {\nval = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nvar rPrev = self.rear.?.prev;\nif (rPrev != null) {\nrPrev.?.next = null;\nself.rear.?.prev = null;\n}\nself.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nself.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n} // \u961f\u9996\u51fa\u961f\npub fn popFirst(self: *Self) T {\nreturn self.pop(true);\n} // \u961f\u5c3e\u51fa\u961f\npub fn popLast(self: *Self) T {\nreturn self.pop(false);\n} // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\npub fn peekFirst(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nreturn self.front.?.val;\n}  // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\npub fn peekLast(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nreturn self.rear.?.val;\n}\n// \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\npub fn toArray(self: *Self) ![]T {\nvar node = self.front;\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nwhile (i < res.len) : (i += 1) {\nres[i] = node.?.val;\nnode = node.?.next;\n}\nreturn res;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/deque/#_2","title":"\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\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\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\u3002

ArrayDequepushLast()pushFirst()popLast()popFirst()

\u4ee5\u4e0b\u662f\u5177\u4f53\u5b9e\u73b0\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_deque.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n/* \u6784\u9020\u65b9\u6cd5 */\npublic ArrayDeque(int capacity) {\nthis.nums = new int[capacity];\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\npublic int capacity() {\nreturn nums.length;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn queSize == 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nprivate 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\nreturn (i + capacity()) % capacity();\n}\n/* \u961f\u9996\u5165\u961f */\npublic void pushFirst(int num) {\nif (queSize == capacity()) {\nSystem.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nfront = index(front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nnums[front] = num;\nqueSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\npublic void pushLast(int num) {\nif (queSize == capacity()) {\nSystem.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nint rear = index(front + queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\npublic int popFirst() {\nint num = peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfront = index(front + 1);\nqueSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\npublic int popLast() {\nint num = peekLast();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peekFirst() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int peekLast() {\nif (isEmpty())\nthrow new EmptyStackException();\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nint last = index(front + queSize - 1);\nreturn nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\npublic int[] toArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] res = new int[queSize];\nfor (int i = 0, j = front; i < queSize; i++, j++) {\nres[i] = nums[index(j)];\n}\nreturn res;\n}\n}\n
array_deque.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate:\nvector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nArrayDeque(int capacity) {\nnums.resize(capacity);\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity() {\nreturn nums.size();\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty() {\nreturn queSize == 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint 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\nreturn (i + capacity()) % capacity();\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(int num) {\nif (queSize == capacity()) {\ncout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nfront = index(front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nnums[front] = num;\nqueSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(int num) {\nif (queSize == capacity()) {\ncout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nint rear = index(front + queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst() {\nint num = peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfront = index(front + 1);\nqueSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast() {\nint num = peekLast();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst() {\nif (isEmpty())\nthrow out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast() {\nif (isEmpty())\nthrow out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nint last = index(front + queSize - 1);\nreturn nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nvector<int> toVector() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvector<int> res(queSize);\nfor (int i = 0, j = front; i < queSize; i++, j++) {\nres[i] = nums[index(j)];\n}\nreturn res;\n}\n};\n
array_deque.py
class ArrayDeque:\n\"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\ndef __init__(self, capacity: int) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__nums: list[int] = [0] * capacity\nself.__front: int = 0\nself.__size: int = 0\ndef capacity(self) -> int:\n\"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\nreturn len(self.__nums)\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.__size == 0\ndef 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\nreturn (i + self.capacity()) % self.capacity()\ndef push_first(self, num: int) -> None:\n\"\"\"\u961f\u9996\u5165\u961f\"\"\"\nif self.__size == self.capacity():\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n# \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n# \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nself.__front = self.index(self.__front - 1)\n# \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nself.__nums[self.__front] = num\nself.__size += 1\ndef push_last(self, num: int) -> None:\n\"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\nif self.__size == self.capacity():\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n# \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nrear = self.index(self.__front + self.__size)\n# \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nself.__nums[rear] = num\nself.__size += 1\ndef pop_first(self) -> int:\n\"\"\"\u961f\u9996\u51fa\u961f\"\"\"\nnum = self.peek_first()\n# \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nself.__front = self.index(self.__front + 1)\nself.__size -= 1\nreturn num\ndef pop_last(self) -> int:\n\"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\nnum = self.peek_last()\nself.__size -= 1\nreturn num\ndef peek_first(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\"\nreturn self.__nums[self.__front]\ndef peek_last(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\"\n# \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nlast = self.index(self.__front + self.__size - 1)\nreturn self.__nums[last]\ndef 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\nres = []\nfor i in range(self.__size):\nres.append(self.__nums[self.index(self.__front + i)])\nreturn res\n
array_deque.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\nnums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nfront       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nqueSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\nqueCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\nreturn &arrayDeque{\nnums:        make([]int, queCapacity),\nqueCapacity: queCapacity,\nfront:       0,\nqueSize:     0,\n}\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\nreturn q.queSize\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\nreturn q.queSize == 0\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\nreturn (i + q.queCapacity) % q.queCapacity\n}\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\nif q.queSize == q.queCapacity {\nfmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nq.front = q.index(q.front - 1)\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nq.nums[q.front] = num\nq.queSize++\n}\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\nif q.queSize == q.queCapacity {\nfmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nrear := q.index(q.front + q.queSize)\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nq.nums[rear] = num\nq.queSize++\n}\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\nnum := q.peekFirst()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nq.front = q.index(q.front + 1)\nq.queSize--\nreturn num\n}\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\nnum := q.peekLast()\nq.queSize--\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\nif q.isEmpty() {\nreturn nil\n}\nreturn q.nums[q.front]\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\nif q.isEmpty() {\nreturn nil\n}\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nlast := q.index(q.front + q.queSize - 1)\nreturn q.nums[last]\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\nres := make([]int, q.queSize)\nfor i, j := 0, q.front; i < q.queSize; i++ {\nres[i] = q.nums[q.index(j)]\nj++\n}\nreturn res\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/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(capacity) {\nthis.#nums = new Array(capacity);\nthis.#front = 0;\nthis.#queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\ncapacity() {\nreturn this.#nums.length;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.#queSize === 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nindex(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\nreturn (i + this.capacity()) % this.capacity();\n}\n/* \u961f\u9996\u5165\u961f */\npushFirst(num) {\nif (this.#queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nthis.#front = this.index(this.#front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nthis.#nums[this.#front] = num;\nthis.#queSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\npushLast(num) {\nif (this.#queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nconst rear = this.index(this.#front + this.#queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.#nums[rear] = num;\nthis.#queSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\npopFirst() {\nconst num = this.peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nthis.#front = this.index(this.#front + 1);\nthis.#queSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\npopLast() {\nconst num = this.peekLast();\nthis.#queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst() {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\nreturn this.#nums[this.#front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast() {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nconst last = this.index(this.#front + this.#queSize - 1);\nreturn this.#nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\ntoArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst res = [];\nfor (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\nres[i] = this.#nums[this.index(j)];\n}\nreturn res;\n}\n}\n
array_deque.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(capacity: number) {\nthis.nums = new Array(capacity);\nthis.front = 0;\nthis.queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\ncapacity(): number {\nreturn this.nums.length;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.queSize === 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nindex(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\nreturn (i + this.capacity()) % this.capacity();\n}\n/* \u961f\u9996\u5165\u961f */\npushFirst(num: number): void {\nif (this.queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nthis.front = this.index(this.front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nthis.nums[this.front] = num;\nthis.queSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\npushLast(num: number): void {\nif (this.queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nconst rear: number = this.index(this.front + this.queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.nums[rear] = num;\nthis.queSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\npopFirst(): number {\nconst num: number = this.peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nthis.front = this.index(this.front + 1);\nthis.queSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\npopLast(): number {\nconst num: number = this.peekLast();\nthis.queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst(): number {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\nreturn this.nums[this.front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast(): number {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nconst last = this.index(this.front + this.queSize - 1);\nreturn this.nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\ntoArray(): number[] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst res: number[] = [];\nfor (let i = 0, j = this.front; i < this.queSize; i++, j++) {\nres[i] = this.nums[this.index(j)];\n}\nreturn res;\n}\n}\n
array_deque.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct arrayDeque {\nint *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\nint queCapacity; // \u961f\u5217\u5bb9\u91cf\n};\n/* \u6784\u9020\u51fd\u6570 */\narrayDeque *newArrayDeque(int capacity) {\narrayDeque *deque = (arrayDeque *)malloc(sizeof(arrayDeque));\n// \u521d\u59cb\u5316\u6570\u7ec4\ndeque->queCapacity = capacity;\ndeque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\ndeque->front = deque->queSize = 0;\nreturn deque;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(arrayDeque *deque) {\nfree(deque->nums);\ndeque->queCapacity = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(arrayDeque *deque) {\nreturn deque->queCapacity;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(arrayDeque *deque) {\nreturn deque->queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(arrayDeque *deque) {\nreturn deque->queSize == 0;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(arrayDeque *deque) {\nreturn deque->queSize == 0;\n}\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\nreturn ((i + capacity(deque)) % capacity(deque));\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(arrayDeque *deque, int num) {\nif (deque->queSize == capacity(deque)) {\nprintf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\ndeque->front = dequeIndex(deque, deque->front - 1);\n// \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\ndeque->nums[deque->front] = num;\ndeque->queSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(arrayDeque *deque, int num) {\nif (deque->queSize == capacity(deque)) {\nprintf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nint rear = dequeIndex(deque, deque->front + deque->queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque->nums[rear] = num;\ndeque->queSize++;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(arrayDeque *deque) {\n// \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\nassert(empty(deque) == 0);\nreturn deque->nums[deque->front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(arrayDeque *deque) {\n// \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\nassert(empty(deque) == 0);\nint last = dequeIndex(deque, deque->front + deque->queSize - 1);\nreturn deque->nums[last];\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(arrayDeque *deque) {\nint num = peekFirst(deque);\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\ndeque->front = dequeIndex(deque, deque->front + 1);\ndeque->queSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(arrayDeque *deque) {\nint num = peekLast(deque);\ndeque->queSize--;\nreturn num;\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printArrayDeque(arrayDeque *deque) {\nint arr[deque->queSize];\n// \u62f7\u8d1d\nfor (int i = 0, j = deque->front; i < deque->queSize; i++, j++) {\narr[i] = deque->nums[j % deque->queCapacity];\n}\nprintArray(arr, deque->queSize);\n}\n
array_deque.cs
[class]{ArrayDeque}-[func]{}\n
array_deque.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate var queSize: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n/* \u6784\u9020\u65b9\u6cd5 */\ninit(capacity: Int) {\nnums = Array(repeating: 0, count: capacity)\nfront = 0\nqueSize = 0\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nfunc capacity() -> Int {\nnums.count\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nqueSize\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nprivate 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/* \u961f\u9996\u5165\u961f */\nfunc pushFirst(num: Int) {\nif size() == capacity() {\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nfront = index(i: front - 1)\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nnums[front] = num\nqueSize += 1\n}\n/* \u961f\u5c3e\u5165\u961f */\nfunc pushLast(num: Int) {\nif size() == capacity() {\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nlet rear = index(i: front + size())\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num\nqueSize += 1\n}\n/* \u961f\u9996\u51fa\u961f */\nfunc popFirst() -> Int {\nlet num = peekFirst()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfront = index(i: front + 1)\nqueSize -= 1\nreturn num\n}\n/* \u961f\u5c3e\u51fa\u961f */\nfunc popLast() -> Int {\nlet num = peekLast()\nqueSize -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peekFirst() -> Int {\nif isEmpty() {\nfatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n}\nreturn nums[front]\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc peekLast() -> Int {\nif isEmpty() {\nfatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n}\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nlet last = index(i: front + size() - 1)\nreturn nums[last]\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nfunc toArray() -> [Int] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar res = Array(repeating: 0, count: size())\nfor (i, j) in sequence(first: (0, front), next: { $0 < self.size() - 1 ? ($0 + 1, $1 + 1) : nil }) {\nres[i] = nums[index(i: j)]\n}\nreturn res\n}\n}\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\u5373\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":"

\u300c\u961f\u5217 Queue\u300d\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\uff08First In, First Out\uff09\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\u7684\u5c3e\u90e8\uff0c\u800c\u4f4d\u4e8e\u961f\u5217\u5934\u90e8\u7684\u4eba\u9010\u4e2a\u79bb\u5f00\u3002

\u6211\u4eec\u628a\u961f\u5217\u7684\u5934\u90e8\u79f0\u4e3a\u300c\u961f\u9996\u300d\uff0c\u5c3e\u90e8\u79f0\u4e3a\u300c\u961f\u5c3e\u300d\uff0c\u628a\u5c06\u5143\u7d20\u52a0\u5165\u961f\u5c3e\u7684\u64cd\u4f5c\u79f0\u4e3a\u300c\u5165\u961f\u300d\uff0c\u5220\u9664\u961f\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u79f0\u4e3a\u300c\u51fa\u961f\u300d\u3002

Fig. \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\u4e0b\u8868\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

\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig queue.java
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.peek();\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.poll();\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
queue.cpp
/* \u521d\u59cb\u5316\u961f\u5217 */\nqueue<int> queue;\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint front = queue.front();\n/* \u5143\u7d20\u51fa\u961f */\nqueue.pop();\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = queue.empty();\n
queue.py
# \u521d\u59cb\u5316\u961f\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u5c06\u53cc\u5411\u961f\u5217\u7c7b deque \u770b\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\u5efa\u8bae\nque: Deque[int] = collections.deque()\n# \u5143\u7d20\u5165\u961f\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n# \u8bbf\u95ee\u961f\u9996\u5143\u7d20\nfront: int = que[0];\n# \u5143\u7d20\u51fa\u961f\npop: int = que.popleft()\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(que)\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(que) == 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/* \u5143\u7d20\u5165\u961f */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek := queue.Front()\n/* \u5143\u7d20\u51fa\u961f */\npop := queue.Front()\nqueue.Remove(pop)\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nsize := queue.Len()\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := queue.Len() == 0\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/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\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/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\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/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\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/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
queue.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u961f\u5217\n
queue.cs
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<int> queue = new();\n/* \u5143\u7d20\u5165\u961f */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.Dequeue();\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.Count();\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.Count() == 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/* \u5143\u7d20\u5165\u961f */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nlet peek = queue.first!\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/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = queue.count\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = queue.isEmpty\n
queue.zig
\n
"},{"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\u3002\u56e0\u6b64\uff0c\u94fe\u8868\u548c\u6570\u7ec4\u90fd\u53ef\u4ee5\u7528\u6765\u5b9e\u73b0\u961f\u5217\u3002

"},{"location":"chapter_stack_and_queue/queue/#_1","title":"\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u5bf9\u4e8e\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u300c\u5934\u8282\u70b9\u300d\u548c\u300c\u5c3e\u8282\u70b9\u300d\u5206\u522b\u89c6\u4e3a\u961f\u9996\u548c\u961f\u5c3e\uff0c\u89c4\u5b9a\u961f\u5c3e\u4ec5\u53ef\u6dfb\u52a0\u8282\u70b9\uff0c\u800c\u961f\u9996\u4ec5\u53ef\u5220\u9664\u8282\u70b9\u3002

LinkedListQueuepush()pop()

\u4ee5\u4e0b\u662f\u7528\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u793a\u4f8b\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linkedlist_queue.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nprivate int queSize = 0;\npublic LinkedListQueue() {\nfront = null;\nrear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f */\npublic void push(int num) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nListNode 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\nif (front == null) {\nfront = node;\nrear = node;\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n} else {\nrear.next = node;\nrear = node;\n}\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop() {\nint num = peek();\n// \u5220\u9664\u5934\u8282\u70b9\nfront = front.next;\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek() {\nif (size() == 0)\nthrow new EmptyStackException();\nreturn front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\nListNode node = front;\nint[] res = new int[size()];\nfor (int i = 0; i < res.length; i++) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate:\nListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nint queSize;\npublic:\nLinkedListQueue() {\nfront = nullptr;\nrear = nullptr;\nqueSize = 0;\n}\n~LinkedListQueue() {\n// \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\nfreeMemoryLinkedList(front);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn queSize == 0;\n}\n/* \u5165\u961f */\nvoid push(int num) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nListNode *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\nif (front == nullptr) {\nfront = node;\nrear = node;\n}\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse {\nrear->next = node;\nrear = node;\n}\nqueSize++;\n}\n/* \u51fa\u961f */\nvoid pop() {\nint num = peek();\n// \u5220\u9664\u5934\u8282\u70b9\nListNode *tmp = front;\nfront = front->next;\n// \u91ca\u653e\u5185\u5b58\ndelete tmp;\nqueSize--;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek() {\nif (size() == 0)\nthrow out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn front->val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\nvector<int> toVector() {\nListNode *node = front;\nvector<int> res(size());\nfor (int i = 0; i < res.size(); i++) {\nres[i] = node->val;\nnode = node->next;\n}\nreturn res;\n}\n};\n
linkedlist_queue.py
class LinkedListQueue:\n\"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__front: ListNode | None = None  # \u5934\u8282\u70b9 front\nself.__rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\nself.__size: int = 0\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn not self.__front\ndef push(self, num: int) -> None:\n\"\"\"\u5165\u961f\"\"\"\n# \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nnode = ListNode(num)\n# \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\nif self.__front is None:\nself.__front = node\nself.__rear = node\n# \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse:\nself.__rear.next = node\nself.__rear = node\nself.__size += 1\ndef pop(self) -> int:\n\"\"\"\u51fa\u961f\"\"\"\nnum = self.peek()\n# \u5220\u9664\u5934\u8282\u70b9\nself.__front = self.__front.next\nself.__size -= 1\nreturn num\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nif self.size() == 0:\nprint(\"\u961f\u5217\u4e3a\u7a7a\")\nreturn False\nreturn self.__front.val\ndef to_list(self) -> list[int]:\n\"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\nqueue = []\ntemp = self.__front\nwhile temp:\nqueue.append(temp.val)\ntemp = temp.next\nreturn queue\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\ndata *list.List\n}\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\nreturn &linkedListQueue{\ndata: list.New(),\n}\n}\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\ns.data.PushBack(value)\n}\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\nreturn e.Value\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\nreturn s.data.Len()\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\nreturn s.data.Len() == 0\n}\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\nreturn s.data\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;\nconstructor() {\nthis.#front = null;\nthis.#rear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.size === 0;\n}\n/* \u5165\u961f */\npush(num) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nconst 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\nif (!this.#front) {\nthis.#front = node;\nthis.#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 {\nthis.#rear.next = node;\nthis.#rear = node;\n}\nthis.#queSize++;\n}\n/* \u51fa\u961f */\npop() {\nconst num = this.peek();\n// \u5220\u9664\u5934\u8282\u70b9\nthis.#front = this.#front.next;\nthis.#queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek() {\nif (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.#front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray() {\nlet node = this.#front;\nconst res = new Array(this.size);\nfor (let i = 0; i < res.length; i++) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate front: ListNode | null; // \u5934\u8282\u70b9 front\nprivate rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\nprivate queSize: number = 0;\nconstructor() {\nthis.front = null;\nthis.rear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.size === 0;\n}\n/* \u5165\u961f */\npush(num: number): void {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nconst 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\nif (!this.front) {\nthis.front = node;\nthis.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 {\nthis.rear!.next = node;\nthis.rear = node;\n}\nthis.queSize++;\n}\n/* \u51fa\u961f */\npop(): number {\nconst num = this.peek();\nif (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n// \u5220\u9664\u5934\u8282\u70b9\nthis.front = this.front.next;\nthis.queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek(): number {\nif (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.front!.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray(): number[] {\nlet node = this.front;\nconst res = new Array<number>(this.size);\nfor (let i = 0; i < res.length; i++) {\nres[i] = node!.val;\nnode = node!.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct linkedListQueue {\nListNode *front, *rear;\nint queSize;\n};\n/* \u6784\u9020\u51fd\u6570 */\nlinkedListQueue *newLinkedListQueue() {\nlinkedListQueue *queue = (linkedListQueue *)malloc(sizeof(linkedListQueue));\nqueue->front = NULL;\nqueue->rear = NULL;\nqueue->queSize = 0;\nreturn queue;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(linkedListQueue *queue) {\n// \u91ca\u653e\u6240\u6709\u8282\u70b9\nfor (int i = 0; i < queue->queSize && queue->front != NULL; i++) {\nListNode *tmp = queue->front;\nqueue->front = queue->front->next;\nfree(tmp);\n}\n// \u91ca\u653e queue \u7ed3\u6784\u4f53\nfree(queue);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(linkedListQueue *queue) {\nreturn queue->queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(linkedListQueue *queue) {\nreturn (size(queue) == 0);\n}\n/* \u5165\u961f */\nvoid push(linkedListQueue *queue, int num) {\n// \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\nListNode *node = newListNode(num);\n// \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\nif (queue->front == NULL) {\nqueue->front = node;\nqueue->rear = node;\n}\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse {\nqueue->rear->next = node;\nqueue->rear = node;\n}\nqueue->queSize++;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(linkedListQueue *queue) {\nassert(size(queue) && queue->front);\nreturn queue->front->val;\n}\n/* \u51fa\u961f */\nvoid pop(linkedListQueue *queue) {\nint num = peek(queue);\nListNode *tmp = queue->front;\nqueue->front = queue->front->next;\nfree(tmp);\nqueue->queSize--;\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(linkedListQueue *queue) {\nint arr[queue->queSize];\n// \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\nint i;\nListNode *node;\nfor (i = 0, node = queue->front; i < queue->queSize && queue->front != queue->rear; i++) {\narr[i] = node->val;\nnode = node->next;\n}\nprintArray(arr, queue->queSize);\n}\n
linkedlist_queue.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue\n{\nprivate ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \nprivate int queSize = 0;\npublic LinkedListQueue()\n{\nfront = null;\nrear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn size() == 0;\n}\n/* \u5165\u961f */\npublic void push(int num)\n{\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nListNode 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\nif (front == null)\n{\nfront = node;\nrear = node;\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n}\nelse if (rear != null)\n{\nrear.next = node;\nrear = node;\n}\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop()\n{\nint num = peek();\n// \u5220\u9664\u5934\u8282\u70b9\nfront = front?.next;\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek()\n{\nif (size() == 0 || front == null)\nthrow new Exception();\nreturn front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray()\n{\nif (front == null)\nreturn Array.Empty<int>();\nListNode node = front;\nint[] res = new int[size()];\nfor (int i = 0; i < res.Length; i++)\n{\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate var front: ListNode? // \u5934\u8282\u70b9\nprivate var rear: ListNode? // \u5c3e\u8282\u70b9\nprivate var _size = 0\ninit() {}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\n_size\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u5165\u961f */\nfunc push(num: Int) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nlet 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\nif front == nil {\nfront = node\nrear = node\n}\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse {\nrear?.next = node\nrear = node\n}\n_size += 1\n}\n/* \u51fa\u961f */\n@discardableResult\nfunc pop() -> Int {\nlet num = peek()\n// \u5220\u9664\u5934\u8282\u70b9\nfront = front?.next\n_size -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n}\nreturn front!.val\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nfunc toArray() -> [Int] {\nvar node = front\nvar res = Array(repeating: 0, count: size())\nfor i in res.indices {\nres[i] = node!.val\nnode = node?.next\n}\nreturn res\n}\n}\n
linkedlist_queue.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nfront: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\nrear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\nque_size: usize = 0,                             // \u961f\u5217\u7684\u957f\u5ea6\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.front = null;\nself.rear = null;\nself.que_size = 0;\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.que_size;\n}\n// \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u8bbf\u95ee\u961f\u9996\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn self.front.?.val;\n}  // \u5165\u961f\npub fn push(self: *Self, num: T) !void {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nvar node = try self.mem_allocator.create(inc.ListNode(T));\nnode.init(num);\n// \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\nif (self.front == null) {\nself.front = node;\nself.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 {\nself.rear.?.next = node;\nself.rear = node;\n}\nself.que_size += 1;\n} // \u51fa\u961f\npub fn pop(self: *Self) T {\nvar num = self.peek();\n// \u5220\u9664\u5934\u8282\u70b9\nself.front = self.front.?.next;\nself.que_size -= 1;\nreturn num;\n} // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\nvar node = self.front;\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nwhile (i < res.len) : (i += 1) {\nres[i] = node.?.val;\nnode = node.?.next;\n}\nreturn res;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/queue/#_2","title":"\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u7531\u4e8e\u6570\u7ec4\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 queSize \u7528\u4e8e\u8bb0\u5f55\u961f\u5217\u957f\u5ea6\u3002\u5b9a\u4e49 rear = front + queSize \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\u8fdb\u800c\uff1a

  • \u5bf9\u4e8e\u5165\u961f\u64cd\u4f5c\uff0c\u5c06\u8f93\u5165\u5143\u7d20\u8d4b\u503c\u7ed9 rear \u7d22\u5f15\u5904\uff0c\u5e76\u5c06 queSize \u589e\u52a0 1 \uff1b
  • \u5bf9\u4e8e\u51fa\u961f\u64cd\u4f5c\uff0c\u53ea\u9700\u5c06 front \u589e\u52a0 1 \uff0c\u5e76\u5c06 queSize \u51cf\u5c11 1 \uff1b

\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()

\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\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u89c6\u4e3a\u9996\u5c3e\u76f8\u63a5\u7684\u300c\u73af\u5f62\u6570\u7ec4\u300d\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_queue.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate int queSize; // \u961f\u5217\u957f\u5ea6\npublic ArrayQueue(int capacity) {\nnums = new int[capacity];\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\npublic int capacity() {\nreturn nums.length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn queSize == 0;\n}\n/* \u5165\u961f */\npublic void push(int num) {\nif (queSize == capacity()) {\nSystem.out.println(\"\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (front + queSize) % capacity();\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop() {\nint num = peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % capacity();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn nums[front];\n}\n/* \u8fd4\u56de\u6570\u7ec4 */\npublic int[] toArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] res = new int[queSize];\nfor (int i = 0, j = front; i < queSize; i++, j++) {\nres[i] = nums[j % capacity()];\n}\nreturn res;\n}\n}\n
array_queue.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate:\nint *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;     // \u961f\u5217\u957f\u5ea6\nint queCapacity; // \u961f\u5217\u5bb9\u91cf\npublic:\nArrayQueue(int capacity) {\n// \u521d\u59cb\u5316\u6570\u7ec4\nnums = new int[capacity];\nqueCapacity = capacity;\nfront = queSize = 0;\n}\n~ArrayQueue() {\ndelete[] nums;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity() {\nreturn queCapacity;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn size() == 0;\n}\n/* \u5165\u961f */\nvoid push(int num) {\nif (queSize == queCapacity) {\ncout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\nreturn;\n}\n// \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (front + queSize) % queCapacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u51fa\u961f */\nvoid pop() {\nint num = peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % queCapacity;\nqueSize--;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek() {\nif (empty())\nthrow out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn nums[front];\n}\n/* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\nvector<int> toVector() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvector<int> arr(queSize);\nfor (int i = 0, j = front; i < queSize; i++, j++) {\narr[i] = nums[j % queCapacity];\n}\nreturn arr;\n}\n};\n
array_queue.py
class ArrayQueue:\n\"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\ndef __init__(self, size: int) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nself.__front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nself.__size: int = 0  # \u961f\u5217\u957f\u5ea6\ndef capacity(self) -> int:\n\"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\nreturn len(self.__nums)\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.__size == 0\ndef push(self, num: int) -> None:\n\"\"\"\u5165\u961f\"\"\"\nassert self.__size < self.capacity(), \"\u961f\u5217\u5df2\u6ee1\"\n# \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n# \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nrear: int = (self.__front + self.__size) % self.capacity()\n# \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nself.__nums[rear] = num\nself.__size += 1\ndef pop(self) -> int:\n\"\"\"\u51fa\u961f\"\"\"\nnum: int = self.peek()\n# \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nself.__front = (self.__front + 1) % self.capacity()\nself.__size -= 1\nreturn num\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u961f\u5217\u4e3a\u7a7a\"\nreturn self.__nums[self.__front]\ndef to_list(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\nres: list[int] = [0] * self.size()\nj: int = self.__front\nfor i in range(self.size()):\nres[i] = self.__nums[(j % self.capacity())]\nj += 1\nreturn res\n
array_queue.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\nnums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nfront       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nqueSize     int   // \u961f\u5217\u957f\u5ea6\nqueCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\nreturn &arrayQueue{\nnums:        make([]int, queCapacity),\nqueCapacity: queCapacity,\nfront:       0,\nqueSize:     0,\n}\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\nreturn q.queSize\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\nreturn q.queSize == 0\n}\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n// \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\nif q.queSize == q.queCapacity {\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nrear := (q.front + q.queSize) % q.queCapacity\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nq.nums[rear] = num\nq.queSize++\n}\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\nnum := q.peek()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nq.front = (q.front + 1) % q.queCapacity\nq.queSize--\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\nif q.isEmpty() {\nreturn nil\n}\nreturn q.nums[q.front]\n}\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\nrear := (q.front + q.queSize)\nif rear >= q.queCapacity {\nrear %= q.queCapacity\nreturn append(q.nums[q.front:], q.nums[:rear]...)\n}\nreturn q.nums[q.front:rear]\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\nconstructor(capacity) {\nthis.#nums = new Array(capacity);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nget capacity() {\nreturn this.#nums.length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nempty() {\nreturn this.#queSize == 0;\n}\n/* \u5165\u961f */\npush(num) {\nif (this.size == this.capacity) {\nconsole.log('\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nconst rear = (this.#front + this.size) % this.capacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.#nums[rear] = num;\nthis.#queSize++;\n}\n/* \u51fa\u961f */\npop() {\nconst num = this.peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nthis.#front = (this.#front + 1) % this.capacity;\nthis.#queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek() {\nif (this.empty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.#nums[this.#front];\n}\n/* \u8fd4\u56de Array */\ntoArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst arr = new Array(this.size);\nfor (let i = 0, j = this.#front; i < this.size; i++, j++) {\narr[i] = this.#nums[j % this.capacity];\n}\nreturn arr;\n}\n}\n
array_queue.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate queSize: number; // \u961f\u5217\u957f\u5ea6\nconstructor(capacity: number) {\nthis.nums = new Array(capacity);\nthis.front = this.queSize = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nget capacity(): number {\nreturn this.nums.length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nempty(): boolean {\nreturn this.queSize == 0;\n}\n/* \u5165\u961f */\npush(num: number): void {\nif (this.size == this.capacity) {\nconsole.log('\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nconst rear = (this.front + this.queSize) % this.capacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.nums[rear] = num;\nthis.queSize++;\n}\n/* \u51fa\u961f */\npop(): number {\nconst num = this.peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nthis.front = (this.front + 1) % this.capacity;\nthis.queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek(): number {\nif (this.empty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.nums[this.front];\n}\n/* \u8fd4\u56de Array */\ntoArray(): number[] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst arr = new Array(this.size);\nfor (let i = 0, j = this.front; i < this.size; i++, j++) {\narr[i] = this.nums[j % this.capacity];\n}\nreturn arr;\n}\n}\n
array_queue.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct arrayQueue {\nint *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\nint queCapacity; // \u961f\u5217\u5bb9\u91cf\n};\n/* \u6784\u9020\u51fd\u6570 */\narrayQueue *newArrayQueue(int capacity) {\narrayQueue *queue = (arrayQueue *)malloc(sizeof(arrayQueue));\n// \u521d\u59cb\u5316\u6570\u7ec4\nqueue->queCapacity = capacity;\nqueue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\nqueue->front = queue->queSize = 0;\nreturn queue;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(arrayQueue *queue) {\nfree(queue->nums);\nqueue->queCapacity = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(arrayQueue *queue) {\nreturn queue->queCapacity;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(arrayQueue *queue) {\nreturn queue->queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(arrayQueue *queue) {\nreturn queue->queSize == 0;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(arrayQueue *queue) {\nassert(size(queue) != 0);\nreturn queue->nums[queue->front];\n}\n/* \u5165\u961f */\nvoid push(arrayQueue *queue, int num) {\nif (size(queue) == capacity(queue)) {\nprintf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\nreturn;\n}\n// \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (queue->front + queue->queSize) % queue->queCapacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nqueue->nums[rear] = num;\nqueue->queSize++;\n}\n/* \u51fa\u961f */\nvoid pop(arrayQueue *queue) {\nint num = peek(queue);\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nqueue->front = (queue->front + 1) % queue->queCapacity;\nqueue->queSize--;\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printArrayQueue(arrayQueue *queue) {\nint arr[queue->queSize];\n// \u62f7\u8d1d\nfor (int i = 0, j = queue->front; i < queue->queSize; i++, j++) {\narr[i] = queue->nums[j % queue->queCapacity];\n}\nprintArray(arr, queue->queSize);\n}\n
array_queue.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue\n{\nprivate int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate int queSize; // \u961f\u5217\u957f\u5ea6\npublic ArrayQueue(int capacity)\n{\nnums = new int[capacity];\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\npublic int capacity()\n{\nreturn nums.Length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn queSize == 0;\n}\n/* \u5165\u961f */\npublic void push(int num)\n{\nif (queSize == capacity())\n{\nConsole.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (front + queSize) % capacity();\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop()\n{\nint num = peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % capacity();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek()\n{\nif (isEmpty())\nthrow new Exception();\nreturn nums[front];\n}\n/* \u8fd4\u56de\u6570\u7ec4 */\npublic int[] toArray()\n{\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] res = new int[queSize];\nfor (int i = 0, j = front; i < queSize; i++, j++)\n{\nres[i] = nums[j % this.capacity()];\n}\nreturn res;\n}\n}\n
array_queue.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate var front = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate var queSize = 0 // \u961f\u5217\u957f\u5ea6\ninit(capacity: Int) {\n// \u521d\u59cb\u5316\u6570\u7ec4\nnums = Array(repeating: 0, count: capacity)\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nfunc capacity() -> Int {\nnums.count\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nqueSize\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nqueSize == 0\n}\n/* \u5165\u961f */\nfunc push(num: Int) {\nif size() == capacity() {\nprint(\"\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nlet rear = (front + queSize) % capacity()\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num\nqueSize += 1\n}\n/* \u51fa\u961f */\n@discardableResult\nfunc pop() -> Int {\nlet num = peek()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % capacity()\nqueSize -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n}\nreturn nums[front]\n}\n/* \u8fd4\u56de\u6570\u7ec4 */\nfunc toArray() -> [Int] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar res = Array(repeating: 0, count: queSize)\nfor (i, j) in sequence(first: (0, front), next: { $0 < self.queSize - 1 ? ($0 + 1, $1 + 1) : nil }) {\nres[i] = nums[j % capacity()]\n}\nreturn res\n}\n}\n
array_queue.zig
// \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nnums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \ncap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\nfront: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nque_size: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.cap = cap;\nself.nums = try self.mem_allocator.alloc(T, self.cap);\nstd.mem.set(T, self.nums, @as(T, 0));\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\npub fn capacity(self: *Self) usize {\nreturn self.cap;\n}\n// \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.que_size;\n}\n// \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.que_size == 0;\n}\n// \u5165\u961f\npub fn push(self: *Self, num: T) !void {\nif (self.size() == self.capacity()) {\nstd.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nvar rear = (self.front + self.que_size) % self.capacity();\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nself.nums[rear] = num;\nself.que_size += 1;\n} // \u51fa\u961f\npub fn pop(self: *Self) T {\nvar num = self.peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nself.front = (self.front + 1) % self.capacity();\nself.que_size -= 1;\nreturn num;\n} // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn self.nums[self.front];\n} // \u8fd4\u56de\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nvar j: usize = self.front;\nwhile (i < self.size()) : ({ i += 1; j += 1; }) {\nres[i] = self.nums[j % self.capacity()];\n}\nreturn res;\n}\n};\n}\n

\u4ee5\u4e0a\u5b9e\u73b0\u7684\u961f\u5217\u4ecd\u7136\u5177\u6709\u5c40\u9650\u6027\uff0c\u5373\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\u540c\u5b66\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\u4f9d\u6b21\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\u3002\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":"

\u300c\u6808 Stack\u300d\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\uff08First In, Last Out\uff09\u539f\u5219\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\u9700\u8981\u62ff\u51fa\u5e95\u90e8\u7684\u76d8\u5b50\uff0c\u5219\u9700\u8981\u5148\u5c06\u4e0a\u9762\u7684\u76d8\u5b50\u4f9d\u6b21\u53d6\u51fa\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\u6570\u636e\u7ed3\u6784\u3002

\u5728\u6808\u4e2d\uff0c\u6211\u4eec\u628a\u5806\u53e0\u5143\u7d20\u7684\u9876\u90e8\u79f0\u4e3a\u300c\u6808\u9876\u300d\uff0c\u5e95\u90e8\u79f0\u4e3a\u300c\u6808\u5e95\u300d\u3002\u5c06\u628a\u5143\u7d20\u6dfb\u52a0\u5230\u6808\u9876\u7684\u64cd\u4f5c\u53eb\u505a\u300c\u5165\u6808\u300d\uff0c\u800c\u5220\u9664\u6808\u9876\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u505a\u300c\u51fa\u6808\u300d\u3002

Fig. \u6808\u7684\u5148\u5165\u540e\u51fa\u89c4\u5219

"},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1. \u00a0 \u6808\u5e38\u7528\u64cd\u4f5c","text":"

\u6808\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u4e0b\u8868\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() , pop() , peek() \u547d\u540d\u4e3a\u4f8b\u3002

\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\u300c\u6570\u7ec4\u300d\u6216\u300c\u94fe\u8868\u300d\u89c6\u4f5c\u6808\u6765\u4f7f\u7528\uff0c\u5e76\u901a\u8fc7\u201c\u8111\u8865\u201d\u6765\u5ffd\u7565\u4e0e\u6808\u65e0\u5173\u7684\u64cd\u4f5c\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig stack.java
/* \u521d\u59cb\u5316\u6808 */\nStack<Integer> stack = new Stack<>();\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.peek();\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
stack.cpp
/* \u521d\u59cb\u5316\u6808 */\nstack<int> stack;\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top = stack.top();\n/* \u5143\u7d20\u51fa\u6808 */\nstack.pop(); // \u65e0\u8fd4\u56de\u503c\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool empty = stack.empty();\n
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# \u5143\u7d20\u5165\u6808\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek: int = stack[-1]\n# \u5143\u7d20\u51fa\u6808\npop: int = stack.pop()\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize: int = len(stack)\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(stack) == 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/* \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/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek := stack[len(stack)-1]\n/* \u5143\u7d20\u51fa\u6808 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nsize := len(stack)\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(stack) == 0\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/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\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/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u6808\n
stack.cs
/* \u521d\u59cb\u5316\u6808 */\nStack<int> stack = new ();\n/* \u5143\u7d20\u5165\u6808 */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.Peek();\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.Pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.Count();\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.Count()==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/* \u5143\u7d20\u5165\u6808 */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet peek = stack.last!\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.removeLast()\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.count\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = stack.isEmpty\n
stack.zig
\n
"},{"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\u88ab\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":"\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u4f7f\u7528\u94fe\u8868\u6765\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

\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()

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u793a\u4f8b\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linkedlist_stack.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate int stkSize = 0; // \u6808\u7684\u957f\u5ea6\npublic LinkedListStack() {\nstackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size() {\nreturn stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num) {\nListNode node = new ListNode(num);\nnode.next = stackPeek;\nstackPeek = node;\nstkSize++;\n}\n/* \u51fa\u6808 */\npublic int pop() {\nint num = peek();\nstackPeek = stackPeek.next;\nstkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (size() == 0)\nthrow new EmptyStackException();\nreturn stackPeek.val;\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\nListNode node = stackPeek;\nint[] res = new int[size()];\nfor (int i = res.length - 1; i >= 0; i--) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate:\nListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nint stkSize;        // \u6808\u7684\u957f\u5ea6\npublic:\nLinkedListStack() {\nstackTop = nullptr;\nstkSize = 0;\n}\n~LinkedListStack() {\n// \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\nfreeMemoryLinkedList(stackTop);\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size() {\nreturn stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn size() == 0;\n}\n/* \u5165\u6808 */\nvoid push(int num) {\nListNode *node = new ListNode(num);\nnode->next = stackTop;\nstackTop = node;\nstkSize++;\n}\n/* \u51fa\u6808 */\nvoid pop() {\nint num = top();\nListNode *tmp = stackTop;\nstackTop = stackTop->next;\n// \u91ca\u653e\u5185\u5b58\ndelete tmp;\nstkSize--;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top() {\nif (size() == 0)\nthrow out_of_range(\"\u6808\u4e3a\u7a7a\");\nreturn stackTop->val;\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nvector<int> toVector() {\nListNode *node = stackTop;\nvector<int> res(size());\nfor (int i = res.size() - 1; i >= 0; i--) {\nres[i] = node->val;\nnode = node->next;\n}\nreturn res;\n}\n};\n
linkedlist_stack.py
class LinkedListStack:\n\"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__peek: ListNode | None = None\nself.__size: int = 0\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn not self.__peek\ndef push(self, val: int) -> None:\n\"\"\"\u5165\u6808\"\"\"\nnode = ListNode(val)\nnode.next = self.__peek\nself.__peek = node\nself.__size += 1\ndef pop(self) -> int:\n\"\"\"\u51fa\u6808\"\"\"\nnum: int = self.peek()\nself.__peek = self.__peek.next\nself.__size -= 1\nreturn num\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n# \u5224\u7a7a\u5904\u7406\nif not self.__peek:\nreturn None\nreturn self.__peek.val\ndef to_list(self) -> list[int]:\n\"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\narr: list[int] = []\nnode = self.__peek\nwhile node:\narr.append(node.val)\nnode = node.next\narr.reverse()\nreturn arr\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\ndata *list.List\n}\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\nreturn &linkedListStack{\ndata: list.New(),\n}\n}\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\ns.data.PushBack(value)\n}\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\nreturn e.Value\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\nreturn s.data.Len()\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\nreturn s.data.Len() == 0\n}\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\nreturn s.data\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\nconstructor() {\nthis.#stackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.size == 0;\n}\n/* \u5165\u6808 */\npush(num) {\nconst node = new ListNode(num);\nnode.next = this.#stackPeek;\nthis.#stackPeek = node;\nthis.#stkSize++;\n}\n/* \u51fa\u6808 */\npop() {\nconst num = this.peek();\nthis.#stackPeek = this.#stackPeek.next;\nthis.#stkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek() {\nif (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.#stackPeek.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray() {\nlet node = this.#stackPeek;\nconst res = new Array(this.size);\nfor (let i = res.length - 1; i >= 0; i--) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\nconstructor() {\nthis.stackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.size == 0;\n}\n/* \u5165\u6808 */\npush(num: number): void {\nconst node = new ListNode(num);\nnode.next = this.stackPeek;\nthis.stackPeek = node;\nthis.stkSize++;\n}\n/* \u51fa\u6808 */\npop(): number {\nconst num = this.peek();\nif (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\nthis.stackPeek = this.stackPeek.next;\nthis.stkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek(): number {\nif (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.stackPeek.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray(): number[] {\nlet node = this.stackPeek;\nconst res = new Array<number>(this.size);\nfor (let i = res.length - 1; i >= 0; i--) {\nres[i] = node!.val;\nnode = node!.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nstruct linkedListStack {\nListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nint size;      // \u6808\u7684\u957f\u5ea6\n};\n/* \u6784\u9020\u51fd\u6570 */\nlinkedListStack *newLinkedListStack() {\nlinkedListStack *s = malloc(sizeof(linkedListStack));\ns->top = NULL;\ns->size = 0;\nreturn s;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(linkedListStack *s) {\nwhile (s->top) {\nListNode *n = s->top->next;\nfree(s->top);\ns->top = n;\n}\nfree(s);\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(linkedListStack *s) {\nassert(s);\nreturn s->size;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(linkedListStack *s) {\nassert(s);\nreturn size(s) == 0;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(linkedListStack *s) {\nassert(s);\nassert(size(s) != 0);\nreturn s->top->val;\n}\n/* \u5165\u6808 */\nvoid push(linkedListStack *s, int num) {\nassert(s);\nListNode *node = (ListNode *)malloc(sizeof(ListNode));\nnode->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\nnode->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\ns->top = node;       // \u66f4\u65b0\u6808\u9876\ns->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n/* \u51fa\u6808 */\nint pop(linkedListStack *s) {\nif (s->size == 0) {\nprintf(\"stack is empty.\\n\");\nreturn INT_MAX;\n}\nassert(s);\nint val = peek(s);\nListNode *tmp = s->top;\ns->top = s->top->next;\n// \u91ca\u653e\u5185\u5b58\nfree(tmp);\ns->size--;\nreturn val;\n}\n
linkedlist_stack.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack\n{\nprivate ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\npublic LinkedListStack()\n{\nstackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num)\n{\nListNode node = new ListNode(num);\nnode.next = stackPeek;\nstackPeek = node;\nstkSize++;\n}\n/* \u51fa\u6808 */\npublic int pop()\n{\nif (stackPeek == null)\nthrow new Exception();\nint num = peek();\nstackPeek = stackPeek.next;\nstkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek()\n{\nif (size() == 0 || stackPeek == null)\nthrow new Exception();\nreturn stackPeek.val;\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray()\n{\nif (stackPeek == null)\nreturn Array.Empty<int>();\nListNode node = stackPeek;\nint[] res = new int[size()];\nfor (int i = res.Length - 1; i >= 0; i--)\n{\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate var _size = 0 // \u6808\u7684\u957f\u5ea6\ninit() {}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc size() -> Int {\n_size\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u5165\u6808 */\nfunc push(num: Int) {\nlet node = ListNode(x: num)\nnode.next = _peek\n_peek = node\n_size += 1\n}\n/* \u51fa\u6808 */\n@discardableResult\nfunc pop() -> Int {\nlet num = peek()\n_peek = _peek?.next\n_size -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u6808\u4e3a\u7a7a\")\n}\nreturn _peek!.val\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nfunc toArray() -> [Int] {\nvar node = _peek\nvar res = Array(repeating: 0, count: _size)\nfor i in sequence(first: res.count - 1, next: { $0 >= 0 + 1 ? $0 - 1 : nil }) {\nres[i] = node!.val\nnode = node?.next\n}\nreturn res\n}\n}\n
linkedlist_stack.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nstack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nstk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.stack_top = null;\nself.stk_size = 0;\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u6808\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.stk_size;\n}\n// \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\nreturn self.stack_top.?.val;\n}  // \u5165\u6808\npub fn push(self: *Self, num: T) !void {\nvar node = try self.mem_allocator.create(inc.ListNode(T));\nnode.init(num);\nnode.next = self.stack_top;\nself.stack_top = node;\nself.stk_size += 1;\n} // \u51fa\u6808\npub fn pop(self: *Self) T {\nvar num = self.peek();\nself.stack_top = self.stack_top.?.next;\nself.stk_size -= 1;\nreturn num;\n} // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\nvar node = self.stack_top;\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nwhile (i < res.len) : (i += 1) {\nres[res.len - i - 1] = node.?.val;\nnode = node.?.next;\n}\nreturn res;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/stack/#_2","title":"\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u5728\u57fa\u4e8e\u300c\u6570\u7ec4\u300d\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u7684\u5c3e\u90e8\u4f5c\u4e3a\u6808\u9876\u3002\u5728\u8fd9\u6837\u7684\u8bbe\u8ba1\u4e0b\uff0c\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u5c31\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()

\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\u9700\u81ea\u884c\u5904\u7406\u6570\u7ec4\u6269\u5bb9\u95ee\u9898\u3002\u4ee5\u4e0b\u4e3a\u793a\u4f8b\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_stack.java
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate ArrayList<Integer> stack;\npublic ArrayStack() {\n// \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\nstack = new ArrayList<>();\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size() {\nreturn stack.size();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num) {\nstack.add(num);\n}\n/* \u51fa\u6808 */\npublic int pop() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn stack.remove(size() - 1);\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn stack.get(size() - 1);\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic Object[] toArray() {\nreturn stack.toArray();\n}\n}\n
array_stack.cpp
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate:\nvector<int> stack;\npublic:\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size() {\nreturn stack.size();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn stack.empty();\n}\n/* \u5165\u6808 */\nvoid push(int num) {\nstack.push_back(num);\n}\n/* \u51fa\u6808 */\nvoid pop() {\nint oldTop = top();\nstack.pop_back();\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top() {\nif (empty())\nthrow out_of_range(\"\u6808\u4e3a\u7a7a\");\nreturn stack.back();\n}\n/* \u8fd4\u56de Vector */\nvector<int> toVector() {\nreturn stack;\n}\n};\n
array_stack.py
class ArrayStack:\n\"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\ndef __init__(self) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__stack: list[int] = []\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\nreturn len(self.__stack)\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.__stack == []\ndef push(self, item: int) -> None:\n\"\"\"\u5165\u6808\"\"\"\nself.__stack.append(item)\ndef pop(self) -> int:\n\"\"\"\u51fa\u6808\"\"\"\nassert not self.is_empty(), \"\u6808\u4e3a\u7a7a\"\nreturn self.__stack.pop()\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u6808\u4e3a\u7a7a\"\nreturn self.__stack[-1]\ndef to_list(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\nreturn self.__stack\n
array_stack.go
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\ndata []int // \u6570\u636e\n}\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\nreturn &arrayStack{\n// \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\ndata: make([]int, 0, 16),\n}\n}\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\nreturn len(s.data)\n}\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\nreturn s.size() == 0\n}\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n// \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\ns.data = append(s.data, v)\n}\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\nval := s.peek()\ns.data = s.data[:len(s.data)-1]\nreturn val\n}\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\nif s.isEmpty() {\nreturn nil\n}\nval := s.data[len(s.data)-1]\nreturn val\n}\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\nreturn s.data\n}\n
array_stack.js
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n#stack;\nconstructor() {\nthis.#stack = [];\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#stack.length;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nempty() {\nreturn this.#stack.length === 0;\n}\n/* \u5165\u6808 */\npush(num) {\nthis.#stack.push(num);\n}\n/* \u51fa\u6808 */\npop() {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.#stack.pop();\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\ntop() {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.#stack[this.#stack.length - 1];\n}\n/* \u8fd4\u56de Array */\ntoArray() {\nreturn this.#stack;\n}\n}\n
array_stack.ts
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate stack: number[];\nconstructor() {\nthis.stack = [];\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.stack.length;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nempty(): boolean {\nreturn this.stack.length === 0;\n}\n/* \u5165\u6808 */\npush(num: number): void {\nthis.stack.push(num);\n}\n/* \u51fa\u6808 */\npop(): number | undefined {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.stack.pop();\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\ntop(): number | undefined {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.stack[this.stack.length - 1];\n}\n/* \u8fd4\u56de Array */\ntoArray() {\nreturn this.stack;\n}\n}\n
array_stack.c
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct arrayStack {\nint *data;\nint size;\n};\n/* \u6784\u9020\u51fd\u6570 */\narrayStack *newArrayStack() {\narrayStack *s = malloc(sizeof(arrayStack));\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\ns->data = malloc(sizeof(int) * MAX_SIZE);\ns->size = 0;\nreturn s;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(arrayStack *s) {\nreturn s->size;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(arrayStack *s) {\nreturn s->size == 0;\n}\n/* \u5165\u6808 */\nvoid push(arrayStack *s, int num) {\nif (s->size == MAX_SIZE) {\nprintf(\"stack is full.\\n\");\nreturn;\n}\ns->data[s->size] = num;\ns->size++;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(arrayStack *s) {\nif (s->size == 0) {\nprintf(\"stack is empty.\\n\");\nreturn INT_MAX;\n}\nreturn s->data[s->size - 1];\n}\n/* \u51fa\u6808 */\nint pop(arrayStack *s) {\nif (s->size == 0) {\nprintf(\"stack is empty.\\n\");\nreturn INT_MAX;\n}\nint val = peek(s);\ns->size--;\nreturn val;\n}\n
array_stack.cs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack\n{\nprivate List<int> stack;\npublic ArrayStack()\n{\n// \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\nstack = new();\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn stack.Count();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num)\n{\nstack.Add(num);\n}\n/* \u51fa\u6808 */\npublic int pop()\n{\nif (isEmpty())\nthrow new Exception();\nvar val = peek();\nstack.RemoveAt(size() - 1);\nreturn val;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek()\n{\nif (isEmpty())\nthrow new Exception();\nreturn stack[size() - 1];\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray()\n{\nreturn stack.ToArray();\n}\n}\n
array_stack.swift
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate var stack: [Int]\ninit() {\n// \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\nstack = []\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nstack.count\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nstack.isEmpty\n}\n/* \u5165\u6808 */\nfunc push(num: Int) {\nstack.append(num)\n}\n/* \u51fa\u6808 */\n@discardableResult\nfunc pop() -> Int {\nif isEmpty() {\nfatalError(\"\u6808\u4e3a\u7a7a\")\n}\nreturn stack.removeLast()\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u6808\u4e3a\u7a7a\")\n}\nreturn stack.last!\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nfunc toArray() -> [Int] {\nstack\n}\n}\n
array_stack.zig
// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nstack: ?std.ArrayList(T) = null,     // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) void {\nif (self.stack == null) {\nself.stack = std.ArrayList(T).init(allocator);\n}\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.stack == null) return;\nself.stack.?.deinit();\n}\n// \u83b7\u53d6\u6808\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.stack.?.items.len;\n}\n// \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\nreturn self.stack.?.items[self.size() - 1];\n}  // \u5165\u6808\npub fn push(self: *Self, num: T) !void {\ntry self.stack.?.append(num);\n} // \u51fa\u6808\npub fn pop(self: *Self) T {\nvar num = self.stack.?.pop();\nreturn num;\n} // \u8fd4\u56de ArrayList\npub fn toList(self: *Self) std.ArrayList(T) {\nreturn self.stack.?;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3. \u00a0 \u4e24\u79cd\u5b9e\u73b0\u5bf9\u6bd4","text":""},{"location":"chapter_stack_and_queue/stack/#_3","title":"\u652f\u6301\u64cd\u4f5c","text":"

\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

"},{"location":"chapter_stack_and_queue/stack/#_4","title":"\u65f6\u95f4\u6548\u7387","text":"

\u5728\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0\u4e2d\uff0c\u5165\u6808\u548c\u51fa\u6808\u64cd\u4f5c\u90fd\u662f\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\u94fe\u8868\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\uff08\u5982 int , double \uff09\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\uff1a

  • \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\uff1b
  • \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\uff1b
"},{"location":"chapter_stack_and_queue/stack/#_5","title":"\u7a7a\u95f4\u6548\u7387","text":"

\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\u8fc7\u5b9e\u9645\u9700\u6c42\u3002\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\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\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\u5c06\u4e0a\u4e00\u4e2a\u7f51\u9875\u6267\u884c\u5165\u6808\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u300c\u540e\u9000\u300d\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u9875\u9762\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\u6267\u884c\u51fa\u6808\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4. \u00a0 \u5c0f\u7ed3","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
  • \u4ece\u65f6\u95f4\u6548\u7387\u89d2\u5ea6\u770b\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\u964d\u4f4e\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\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_tree/array_representation_of_tree/","title":"8.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\u5728\u4e0a\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u5728\u94fe\u8868\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7684\u5404\u9879\u57fa\u672c\u64cd\u4f5c\u3002

\u90a3\u4e48\uff0c\u80fd\u5426\u7528\u300c\u6570\u7ec4\u300d\u6765\u8868\u793a\u4e8c\u53c9\u6811\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#831","title":"8.3.1. \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u5148\u5206\u6790\u4e00\u4e2a\u7b80\u5355\u6848\u4f8b\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u6211\u4eec\u5c06\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u7f16\u53f7\uff08\u4ece \\(0\\) \u5f00\u59cb\uff09\uff0c\u6b64\u65f6\u6bcf\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u552f\u4e00\u7684\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\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

Fig. \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u6620\u5c04\u516c\u5f0f\u7684\u4f5c\u7528\u76f8\u5f53\u4e8e\u94fe\u8868\u4e2d\u7684\u6307\u9488\u3002\u5982\u679c\u6211\u4eec\u5c06\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u5b58\u50a8\u5728\u4e00\u4e2a\u6570\u7ec4\u4e2d\uff0c\u90a3\u4e48\u5bf9\u4e8e\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u8282\u70b9\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u901a\u8fc7\u6620\u5c04\u516c\u5f0f\u6765\u8bbf\u95ee\u5176\u5b50\u8282\u70b9\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#832","title":"8.3.2. \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u53c9\u6811","text":"

\u7136\u800c\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u53ea\u662f\u4e00\u4e2a\u7279\u4f8b\u3002\u5728\u4e8c\u53c9\u6811\u7684\u4e2d\u95f4\u5c42\uff0c\u901a\u5e38\u5b58\u5728\u8bb8\u591a \\(\\text{null}\\) \uff0c\u800c\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5e76\u4e0d\u5305\u542b\u8fd9\u4e9b \\(\\text{null}\\) \u3002\u6211\u4eec\u65e0\u6cd5\u4ec5\u51ed\u8be5\u5e8f\u5217\u6765\u63a8\u6d4b \\(\\text{null}\\) \u7684\u6570\u91cf\u548c\u5206\u5e03\u4f4d\u7f6e\uff0c\u8fd9\u610f\u5473\u7740\u5b58\u5728\u591a\u79cd\u4e8c\u53c9\u6811\u7ed3\u6784\u90fd\u7b26\u5408\u8be5\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002\u663e\u7136\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4e0a\u8ff0\u7684\u6570\u7ec4\u8868\u793a\u65b9\u6cd5\u5df2\u7ecf\u5931\u6548\u3002

Fig. \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 \\(\\text{null}\\)\u3002\u5982\u4e0b\u56fe\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \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 \u6700\u5927\u503c\u6807\u8bb0\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u8282\u70b9\u503c\u4e0d\u80fd\u4e3a INT_MAX\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# \u76f4\u63a5\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 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// \u76f4\u63a5\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// \u76f4\u63a5\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 \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 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 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
\n

Fig. \u4efb\u610f\u7c7b\u578b\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

"},{"location":"chapter_tree/array_representation_of_tree/#833","title":"8.3.3. \u00a0 \u4f18\u52bf\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\u5b58\u5728\u4ee5\u4e0b\u4f18\u70b9\uff1a

  • \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u7f13\u5b58\u53cb\u597d\uff0c\u8bbf\u95ee\u4e0e\u904d\u5386\u901f\u5ea6\u8f83\u5feb\uff1b
  • \u4e0d\u9700\u8981\u5b58\u50a8\u6307\u9488\uff0c\u6bd4\u8f83\u8282\u7701\u7a7a\u95f4\uff1b
  • \u5141\u8bb8\u968f\u673a\u8bbf\u95ee\u8282\u70b9\uff1b

\u7136\u800c\uff0c\u6570\u7ec4\u8868\u793a\u4e5f\u5177\u6709\u4e00\u4e9b\u5c40\u9650\u6027\uff1a

  • \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\uff1b
  • \u5f53\u4e8c\u53c9\u6811\u4e2d\u5b58\u5728\u5927\u91cf \\(\\text{null}\\) \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

\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\uff0c\\(\\text{null}\\) \u53ea\u51fa\u73b0\u5728\u6700\u5e95\u5c42\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u8fd9\u610f\u5473\u7740\u6240\u6709 \\(\\text{null}\\) \u4e00\u5b9a\u51fa\u73b0\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u672b\u5c3e\u3002\u56e0\u6b64\uff0c\u5728\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u5b8c\u5168\u4e8c\u53c9\u6811\u65f6\uff0c\u53ef\u4ee5\u7701\u7565\u5b58\u50a8\u6240\u6709 \\(\\text{null}\\) \u3002

Fig. \u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

"},{"location":"chapter_tree/avl_tree/","title":"8.5. \u00a0 AVL \u6811 *","text":"

\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u4e86\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\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c06\u4ece \\(O(\\log n)\\) \u6076\u5316\u4e3a \\(O(n)\\)\u3002

\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u7ecf\u8fc7\u4e24\u6b21\u5220\u9664\u8282\u70b9\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u4e8c\u53c9\u641c\u7d22\u6811\u4fbf\u4f1a\u9000\u5316\u4e3a\u94fe\u8868\u3002

Fig. AVL \u6811\u5728\u5220\u9664\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

\u518d\u4f8b\u5982\uff0c\u5728\u4ee5\u4e0b\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\u6076\u5316\u3002

Fig. AVL \u6811\u5728\u63d2\u5165\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u5176 1962 \u5e74\u53d1\u8868\u7684\u8bba\u6587 \"An algorithm for the organization of information\" \u4e2d\u63d0\u51fa\u4e86\u300cAVL \u6811\u300d\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/#851-avl","title":"8.5.1. \u00a0 AVL \u6811\u5e38\u89c1\u672f\u8bed","text":"

\u300cAVL \u6811\u300d\u65e2\u662f\u4e8c\u53c9\u641c\u7d22\u6811\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\u4e5f\u88ab\u79f0\u4e3a\u300c\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\u300d\u3002

"},{"location":"chapter_tree/avl_tree/#_1","title":"\u8282\u70b9\u9ad8\u5ea6","text":"

\u5728\u64cd\u4f5c AVL \u6811\u65f6\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u8282\u70b9\u7684\u9ad8\u5ea6\uff0c\u56e0\u6b64\u9700\u8981\u4e3a AVL \u6811\u7684\u8282\u70b9\u7c7b\u6dfb\u52a0 height \u53d8\u91cf\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\npublic int val;        // \u8282\u70b9\u503c\npublic int height;     // \u8282\u70b9\u9ad8\u5ea6\npublic TreeNode left;  // \u5de6\u5b50\u8282\u70b9\npublic TreeNode right; // \u53f3\u5b50\u8282\u70b9\npublic TreeNode(int x) { val = x; }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nstruct TreeNode {\nint val{};          // \u8282\u70b9\u503c\nint height = 0;     // \u8282\u70b9\u9ad8\u5ea6\nTreeNode *left{};   // \u5de6\u5b50\u8282\u70b9\nTreeNode *right{};  // \u53f3\u5b50\u8282\u70b9\nTreeNode() = default;\nexplicit TreeNode(int x) : val(x){}\n};\n
class TreeNode:\n\"\"\"AVL \u6811\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                    # \u8282\u70b9\u503c\nself.height: int = 0                   # \u8282\u70b9\u9ad8\u5ea6\nself.left: Optional[TreeNode] = None   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\nself.right: Optional[TreeNode] = None  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\nVal    int       // \u8282\u70b9\u503c\nHeight int       // \u8282\u70b9\u9ad8\u5ea6\nLeft   *TreeNode // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\nRight  *TreeNode // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nval; // \u8282\u70b9\u503c\nheight; //\u8282\u70b9\u9ad8\u5ea6\nleft; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nright; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nconstructor(val, left, right, height) {\nthis.val = val === undefined ? 0 : val;\nthis.height = height === undefined ? 0 : height;\nthis.left = left === undefined ? null : left;\nthis.right = right === undefined ? null : right;\n}\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nval: number;            // \u8282\u70b9\u503c\nheight: number;         // \u8282\u70b9\u9ad8\u5ea6\nleft: TreeNode | null;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nright: TreeNode | null; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nconstructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\nthis.val = val === undefined ? 0 : val;\nthis.height = height === undefined ? 0 : height; this.left = left === undefined ? null : left; this.right = right === undefined ? null : right; }\n}\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\nint val;\nint height;\nstruct TreeNode *left;\nstruct TreeNode *right;\n};\ntypedef struct TreeNode TreeNode;\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\nTreeNode *node;\nnode = (TreeNode *)malloc(sizeof(TreeNode));\nnode->val = val;\nnode->height = 0;\nnode->left = NULL;\nnode->right = NULL;\nreturn node;\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\npublic int val;          // \u8282\u70b9\u503c\npublic int height;       // \u8282\u70b9\u9ad8\u5ea6\npublic TreeNode? left;   // \u5de6\u5b50\u8282\u70b9\npublic TreeNode? right;  // \u53f3\u5b50\u8282\u70b9\npublic TreeNode(int x) { val = x; }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nvar val: Int // \u8282\u70b9\u503c\nvar height: Int // \u8282\u70b9\u9ad8\u5ea6\nvar left: TreeNode? // \u5de6\u5b50\u8282\u70b9\nvar right: TreeNode? // \u53f3\u5b50\u8282\u70b9\ninit(x: Int) {\nval = x\nheight = 0\n}\n}\n
\n

\u300c\u8282\u70b9\u9ad8\u5ea6\u300d\u662f\u6307\u4ece\u8be5\u8282\u70b9\u5230\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nreturn node == null ? -1 : node.height;\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\nnode.height = Math.max(height(node.left), height(node.right)) + 1;\n}\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\nreturn node == nullptr ? -1 : node->height;\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\nnode->height = max(height(node->left), height(node->right)) + 1;\n}\n
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\nif node is not None:\nreturn node.height\nreturn -1\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\nnode.height = max([self.height(node.left), self.height(node.right)]) + 1\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\nif node != nil {\nreturn node.Height\n}\nreturn -1\n}\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\nlh := t.height(node.Left)\nrh := t.height(node.Right)\n// \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\nif lh > rh {\nnode.Height = lh + 1\n} else {\nnode.Height = rh + 1\n}\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\nreturn node === null ? -1 : node.height;\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\nnode.height =\nMath.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\nreturn node === null ? -1 : node.height;\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\nnode.height =\nMath.max(this.height(node.left), this.height(node.right)) + 1;\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\nif (node != NULL) {\nreturn node->height;\n}\nreturn -1;\n}\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\nint lh = height(node->left);\nint rh = height(node->right);\n// \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\nif (lh > rh) {\nnode->height = lh + 1;\n} else {\nnode->height = rh + 1;\n}\n}\n
avl_tree.cs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node)\n{\n// \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\nreturn node == null ? -1 : node.height;\n}\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node)\n{\n// \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\nnode.height = Math.Max(height(node.left), height(node.right)) + 1;\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\nnode == nil ? -1 : node!.height\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\nnode?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\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\nreturn if (node == null) -1 else node.?.height;\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\nnode.?.height = std.math.max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#_2","title":"\u8282\u70b9\u5e73\u8861\u56e0\u5b50","text":"

\u8282\u70b9\u7684\u300c\u5e73\u8861\u56e0\u5b50 Balance Factor\u300d\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n// \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\nif (node == null)\nreturn 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node.left) - height(node.right);\n}\n
avl_tree.cpp
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n// \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\nif (node == nullptr)\nreturn 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node->left) - height(node->right);\n}\n
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\nif node is None:\nreturn 0\n# \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn self.height(node.left) - self.height(node.right)\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\nif node == nil {\nreturn 0\n}\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn t.height(node.Left) - t.height(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\nif (node === null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn 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\nif (node === null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn this.height(node.left) - this.height(node.right);\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\nif (node == NULL) {\nreturn 0;\n}\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node->left) - height(node->right);\n}\n
avl_tree.cs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node)\n{\n// \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\nif (node == null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node.left) - 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\nguard let node = node else { return 0 }\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node: node.left) - height(node: node.right)\n}\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\nif (node == null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn self.height(node.?.left) - self.height(node.?.right);\n}\n

Note

\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/#852-avl","title":"8.5.2. \u00a0 AVL \u6811\u65cb\u8f6c","text":"

AVL \u6811\u7684\u7279\u70b9\u5728\u4e8e\u300c\u65cb\u8f6c Rotation\u300d\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\u6811\u7684\u300c\u4e8c\u53c9\u641c\u7d22\u6811\u300d\u5c5e\u6027\uff0c\u4e5f\u80fd\u4f7f\u6811\u91cd\u65b0\u53d8\u4e3a\u300c\u5e73\u8861\u4e8c\u53c9\u6811\u300d\u3002

\u6211\u4eec\u5c06\u5e73\u8861\u56e0\u5b50\u7edd\u5bf9\u503c \\(> 1\\) \u7684\u8282\u70b9\u79f0\u4e3a\u300c\u5931\u8861\u8282\u70b9\u300d\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\u6211\u4eec\u5c06\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u65cb\u8f6c\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/avl_tree/#_3","title":"\u53f3\u65cb","text":"

\u5982\u4e0b\u56fe\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\u300c\u53f3\u65cb\u300d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u540e\uff0c\u5b50\u6811\u5df2\u7ecf\u6062\u590d\u5e73\u8861\uff0c\u5e76\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u7279\u6027\u3002

<1><2><3><4>

\u6b64\u5916\uff0c\u5982\u679c\u8282\u70b9 child \u672c\u8eab\u6709\u53f3\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grandChild \uff09\uff0c\u5219\u9700\u8981\u5728\u300c\u53f3\u65cb\u300d\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grandChild \u4f5c\u4e3a node \u7684\u5de6\u5b50\u8282\u70b9\u3002

Fig. \u6709 grandChild \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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\nTreeNode child = node.left;\nTreeNode grandChild = child.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\nTreeNode *child = node->left;\nTreeNode *grandChild = child->right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild->right = node;\nnode->left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.py
def __right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n\"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\nchild = node.left\ngrand_child = child.right\n# \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node\nnode.left = grand_child\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\nself.__update_height(child)\n# \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\nchild := node.Left\ngrandChild := child.Right\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.Right = node\nnode.Left = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\nt.updateHeight(child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\nconst child = node.left;\nconst grandChild = child.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.#updateHeight(node);\nthis.#updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\nconst child = node.left;\nconst grandChild = child.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.updateHeight(node);\nthis.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\nTreeNode *child, *grandChild;\nchild = node->left;\ngrandChild = child->right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild->right = node;\nnode->left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node)\n{\nTreeNode? child = node.left;\nTreeNode? grandChild = child?.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\nlet child = node?.left\nlet grandChild = child?.right\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild?.right = node\nnode?.left = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node: node)\nupdateHeight(node: child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\nvar child = node.?.left;\nvar grandChild = child.?.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.?.right = node;\nnode.?.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.updateHeight(node);\nself.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
"},{"location":"chapter_tree/avl_tree/#_4","title":"\u5de6\u65cb","text":"

\u76f8\u5e94\u7684\uff0c\u5982\u679c\u8003\u8651\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u201c\u955c\u50cf\u201d\uff0c\u5219\u9700\u8981\u6267\u884c\u300c\u5de6\u65cb\u300d\u64cd\u4f5c\u3002

Fig. \u5de6\u65cb\u64cd\u4f5c

\u540c\u7406\uff0c\u82e5\u8282\u70b9 child \u672c\u8eab\u6709\u5de6\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grandChild \uff09\uff0c\u5219\u9700\u8981\u5728\u300c\u5de6\u65cb\u300d\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grandChild \u4f5c\u4e3a node \u7684\u53f3\u5b50\u8282\u70b9\u3002

Fig. \u6709 grandChild \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\u53ef\u4ee5\u8f7b\u677e\u5730\u4ece\u53f3\u65cb\u7684\u4ee3\u7801\u63a8\u5bfc\u51fa\u5de6\u65cb\u7684\u4ee3\u7801\u3002\u5177\u4f53\u5730\uff0c\u53ea\u9700\u5c06\u300c\u53f3\u65cb\u300d\u4ee3\u7801\u4e2d\u7684\u628a\u6240\u6709\u7684 left \u66ff\u6362\u4e3a right \uff0c\u5c06\u6240\u6709\u7684 right \u66ff\u6362\u4e3a left \uff0c\u5373\u53ef\u5f97\u5230\u300c\u5de6\u65cb\u300d\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\nTreeNode child = node.right;\nTreeNode grandChild = child.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\nTreeNode *child = node->right;\nTreeNode *grandChild = child->left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild->left = node;\nnode->right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.py
def __left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n\"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\nchild = node.right\ngrand_child = child.left\n# \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node\nnode.right = grand_child\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\nself.__update_height(child)\n# \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\nchild := node.Right\ngrandChild := child.Left\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.Left = node\nnode.Right = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\nt.updateHeight(child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\nconst child = node.right;\nconst grandChild = child.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.#updateHeight(node);\nthis.#updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\nconst child = node.right;\nconst grandChild = child.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.updateHeight(node);\nthis.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\nTreeNode *child, *grandChild;\nchild = node->right;\ngrandChild = child->left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild->left = node;\nnode->right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node)\n{\nTreeNode? child = node.right;\nTreeNode? grandChild = child?.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\nlet child = node?.right\nlet grandChild = child?.left\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild?.left = node\nnode?.right = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node: node)\nupdateHeight(node: child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\nvar child = node.?.right;\nvar grandChild = child.?.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.?.left = node;\nnode.?.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.updateHeight(node);\nself.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
"},{"location":"chapter_tree/avl_tree/#_5","title":"\u5148\u5de6\u65cb\u540e\u53f3\u65cb","text":"

\u5bf9\u4e8e\u4e0b\u56fe\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\u5de6\u65cb\u540e\u53f3\u65cb\uff0c\u5373\u5148\u5bf9 child \u6267\u884c\u300c\u5de6\u65cb\u300d\uff0c\u518d\u5bf9 node \u6267\u884c\u300c\u53f3\u65cb\u300d\u3002

Fig. \u5148\u5de6\u65cb\u540e\u53f3\u65cb

"},{"location":"chapter_tree/avl_tree/#_6","title":"\u5148\u53f3\u65cb\u540e\u5de6\u65cb","text":"

\u540c\u7406\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u955c\u50cf\u60c5\u51b5\uff0c\u9700\u8981\u5148\u53f3\u65cb\u540e\u5de6\u65cb\uff0c\u5373\u5148\u5bf9 child \u6267\u884c\u300c\u53f3\u65cb\u300d\uff0c\u7136\u540e\u5bf9 node \u6267\u884c\u300c\u5de6\u65cb\u300d\u3002

Fig. \u5148\u53f3\u65cb\u540e\u5de6\u65cb

"},{"location":"chapter_tree/avl_tree/#_7","title":"\u65cb\u8f6c\u7684\u9009\u62e9","text":"

\u4e0b\u56fe\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\u5de6\u65cb\u3001\u5148\u53f3\u540e\u5de6\u3001\u5148\u5de6\u540e\u53f3\u7684\u65cb\u8f6c\u64cd\u4f5c\u3002

Fig. AVL \u6811\u7684\u56db\u79cd\u65cb\u8f6c\u60c5\u51b5

\u5728\u4ee3\u7801\u4e2d\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\u4e0a\u56fe\u4e2d\u7684\u54ea\u79cd\u60c5\u51b5\u3002

\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 \\(>0\\) \uff08\u5373\u5de6\u504f\u6811\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(>0\\) \uff08\u5373\u5de6\u504f\u6811\uff09 \\(<0\\) \u5148\u5de6\u65cb\u540e\u53f3\u65cb \\(<0\\) \uff08\u5373\u53f3\u504f\u6811\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(<0\\) \uff08\u5373\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint balanceFactor = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactor > 1) {\nif (balanceFactor(node.left) >= 0) {\n// \u53f3\u65cb\nreturn rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = leftRotate(node.left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactor < -1) {\nif (balanceFactor(node.right) <= 0) {\n// \u5de6\u65cb\nreturn leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = rightRotate(node.right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\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\nint _balanceFactor = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (_balanceFactor > 1) {\nif (balanceFactor(node->left) >= 0) {\n// \u53f3\u65cb\nreturn rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode->left = leftRotate(node->left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (_balanceFactor < -1) {\nif (balanceFactor(node->right) <= 0) {\n// \u5de6\u65cb\nreturn leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode->right = rightRotate(node->right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\n
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\nbalance_factor = self.balance_factor(node)\n# \u5de6\u504f\u6811\nif balance_factor > 1:\nif self.balance_factor(node.left) >= 0:\n# \u53f3\u65cb\nreturn self.__right_rotate(node)\nelse:\n# \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = self.__left_rotate(node.left)\nreturn self.__right_rotate(node)\n# \u53f3\u504f\u6811\nelif balance_factor < -1:\nif self.balance_factor(node.right) <= 0:\n# \u5de6\u65cb\nreturn self.__left_rotate(node)\nelse:\n# \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = self.__right_rotate(node.right)\nreturn self.__left_rotate(node)\n# \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\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\nbf := t.balanceFactor(node)\n// \u5de6\u504f\u6811\nif bf > 1 {\nif t.balanceFactor(node.Left) >= 0 {\n// \u53f3\u65cb\nreturn t.rightRotate(node)\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.Left = t.leftRotate(node.Left)\nreturn t.rightRotate(node)\n}\n}\n// \u53f3\u504f\u6811\nif bf < -1 {\nif t.balanceFactor(node.Right) <= 0 {\n// \u5de6\u65cb\nreturn t.leftRotate(node)\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.Right = t.rightRotate(node.Right)\nreturn t.leftRotate(node)\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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\nconst balanceFactor = this.balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactor > 1) {\nif (this.balanceFactor(node.left) >= 0) {\n// \u53f3\u65cb\nreturn this.#rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = this.#leftRotate(node.left);\nreturn this.#rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactor < -1) {\nif (this.balanceFactor(node.right) <= 0) {\n// \u5de6\u65cb\nreturn this.#leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = this.#rightRotate(node.right);\nreturn this.#leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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\nconst balanceFactor = this.balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactor > 1) {\nif (this.balanceFactor(node.left) >= 0) {\n// \u53f3\u65cb\nreturn this.rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = this.leftRotate(node.left);\nreturn this.rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactor < -1) {\nif (this.balanceFactor(node.right) <= 0) {\n// \u5de6\u65cb\nreturn this.leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = this.rightRotate(node.right);\nreturn this.leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\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\nint bf = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (bf > 1) {\nif (balanceFactor(node->left) >= 0) {\n// \u53f3\u65cb\nreturn rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode->left = leftRotate(node->left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (bf < -1) {\nif (balanceFactor(node->right) <= 0) {\n// \u5de6\u65cb\nreturn leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode->right = rightRotate(node->right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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{\n// \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\nint balanceFactorInt = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactorInt > 1)\n{\nif (balanceFactor(node.left) >= 0)\n{\n// \u53f3\u65cb\nreturn rightRotate(node);\n}\nelse\n{\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = leftRotate(node?.left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactorInt < -1)\n{\nif (balanceFactor(node.right) <= 0)\n{\n// \u5de6\u65cb\nreturn leftRotate(node);\n}\nelse\n{\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = rightRotate(node?.right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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\nlet balanceFactor = balanceFactor(node: node)\n// \u5de6\u504f\u6811\nif balanceFactor > 1 {\nif self.balanceFactor(node: node?.left) >= 0 {\n// \u53f3\u65cb\nreturn rightRotate(node: node)\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode?.left = leftRotate(node: node?.left)\nreturn rightRotate(node: node)\n}\n}\n// \u53f3\u504f\u6811\nif balanceFactor < -1 {\nif self.balanceFactor(node: node?.right) <= 0 {\n// \u5de6\u65cb\nreturn leftRotate(node: node)\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode?.right = rightRotate(node: node?.right)\nreturn leftRotate(node: node)\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\n}\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\nvar balance_factor = self.balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balance_factor > 1) {\nif (self.balanceFactor(node.?.left) >= 0) {\n// \u53f3\u65cb\nreturn self.rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.?.left = self.leftRotate(node.?.left);\nreturn self.rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balance_factor < -1) {\nif (self.balanceFactor(node.?.right) <= 0) {\n// \u5de6\u65cb\nreturn self.leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.?.right = self.rightRotate(node.?.right);\nreturn self.leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\n
"},{"location":"chapter_tree/avl_tree/#853-avl","title":"8.5.3. \u00a0 AVL \u6811\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#_8","title":"\u63d2\u5165\u8282\u70b9","text":"

\u300cAVL \u6811\u300d\u7684\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u4e0e\u300c\u4e8c\u53c9\u641c\u7d22\u6811\u300d\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\nroot = insertHelper(root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\nif (node == null)\nreturn new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val)\nnode.left = insertHelper(node.left, val);\nelse if (val > node.val)\nnode.right = insertHelper(node.right, val);\nelse\nreturn node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\nroot = insertHelper(root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\nif (node == nullptr)\nreturn new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node->val)\nnode->left = insertHelper(node->left, val);\nelse if (val > node->val)\nnode->right = insertHelper(node->right, val);\nelse\nreturn node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.py
def insert(self, val) -> None:\n\"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\nself.__root = self.__insert_helper(self.__root, val)\ndef __insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n\"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\nif node is None:\nreturn TreeNode(val)\n# 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9\nif val < node.val:\nnode.left = self.__insert_helper(node.left, val)\nelif val > node.val:\nnode.right = self.__insert_helper(node.right, val)\nelse:\n# \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\n# 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nreturn self.__rotate(node)\n
avl_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\nt.root = t.insertHelper(t.root, val)\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\nif node == nil {\nreturn NewTreeNode(val)\n}\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif val < node.Val {\nnode.Left = t.insertHelper(node.Left, val)\n} else if val > node.Val {\nnode.Right = t.insertHelper(node.Right, val)\n} else {\n// \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = t.rotate(node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\nthis.root = this.#insertHelper(this.root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\nif (node === null) return new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val) node.left = this.#insertHelper(node.left, val);\nelse if (val > node.val)\nnode.right = this.#insertHelper(node.right, val);\nelse return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nthis.#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 */\nnode = this.#rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\nthis.root = this.insertHelper(this.root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\nif (node === null) return new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val) {\nnode.left = this.insertHelper(node.left, val);\n} else if (val > node.val) {\nnode.right = this.insertHelper(node.right, val);\n} else {\nreturn node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n}\nthis.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 */\nnode = this.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(aVLTree *tree, int val) {\ntree->root = insertHelper(tree->root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\nif (node == NULL) {\nreturn newTreeNode(val);\n}\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node->val) {\nnode->left = insertHelper(node->left, val);\n} else if (val > node->val) {\nnode->right = insertHelper(node->right, val);\n} else {\n// \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val)\n{\nroot = insertHelper(root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val)\n{\nif (node == null) return new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val)\nnode.left = insertHelper(node.left, val);\nelse if (val > node.val)\nnode.right = insertHelper(node.right, val);\nelse\nreturn node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\n@discardableResult\nfunc insert(val: Int) {\nroot = insertHelper(node: root, val: val)\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\nvar node = node\nif node == nil {\nreturn TreeNode(x: val)\n}\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif val < node!.val {\nnode?.left = insertHelper(node: node?.left, val: val)\n} else if val > node!.val {\nnode?.right = insertHelper(node: node?.right, val: val)\n} else {\nreturn node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n}\nupdateHeight(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 */\nnode = rotate(node: node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) void {\nself.root = try self.insertHelper(self.root, val);\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) {\nvar node = node_;\nif (node == null) {\nvar tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\ntmp_node.init(val);\nreturn tmp_node;\n}\n// 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9\nif (val < node.?.val) {\nnode.?.left = try self.insertHelper(node.?.left, val);\n} else if (val > node.?.val) {\nnode.?.right = try self.insertHelper(node.?.right, val);\n} else {\nreturn node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n}\nself.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\nnode = self.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
"},{"location":"chapter_tree/avl_tree/#_9","title":"\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\u5730\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\nroot = removeHelper(root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\nif (node == null)\nreturn null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val)\nnode.left = removeHelper(node.left, val);\nelse if (val > node.val)\nnode.right = removeHelper(node.right, val);\nelse {\nif (node.left == null || node.right == null) {\nTreeNode child = node.left != null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == null)\nreturn null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse\nnode = 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\nTreeNode temp = node.right;\nwhile (temp.left != null) {\ntemp = temp.left;\n}\nnode.right = removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\nroot = removeHelper(root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\nif (node == nullptr)\nreturn nullptr;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node->val)\nnode->left = removeHelper(node->left, val);\nelse if (val > node->val)\nnode->right = removeHelper(node->right, val);\nelse {\nif (node->left == nullptr || node->right == nullptr) {\nTreeNode *child = node->left != nullptr ? node->left : node->right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == nullptr) {\ndelete node;\nreturn nullptr;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse {\ndelete node;\nnode = 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\nTreeNode *temp = node->right;\nwhile (temp->left != nullptr) {\ntemp = temp->left;\n}\nint tempVal = temp->val;\nnode->right = removeHelper(node->right, temp->val);\nnode->val = tempVal;\n}\n}\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.py
def remove(self, val: int) -> None:\n\"\"\"\u5220\u9664\u8282\u70b9\"\"\"\nself.__root = self.__remove_helper(self.__root, val)\ndef __remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n\"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\nif node is None:\nreturn None\n# 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b\nif val < node.val:\nnode.left = self.__remove_helper(node.left, val)\nelif val > node.val:\nnode.right = self.__remove_helper(node.right, val)\nelse:\nif node.left is None or node.right is None:\nchild = node.left or node.right\n# \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif child is None:\nreturn None\n# \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse:\nnode = child\nelse:\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\ntemp = node.right\nwhile temp.left is not None:\ntemp = temp.left\nnode.right = self.__remove_helper(node.right, temp.val)\nnode.val = temp.val\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\n# 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nreturn self.__rotate(node)\n
avl_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\nt.root = t.removeHelper(t.root, val)\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\nif node == nil {\nreturn nil\n}\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif val < node.Val {\nnode.Left = t.removeHelper(node.Left, val)\n} else if val > node.Val {\nnode.Right = t.removeHelper(node.Right, val)\n} else {\nif node.Left == nil || node.Right == nil {\nchild := node.Left\nif node.Right != nil {\nchild = node.Right\n}\nif child == nil {\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nreturn nil\n} else {\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nnode = 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\ntemp := node.Right\nfor temp.Left != nil {\ntemp = temp.Left\n}\nnode.Right = t.removeHelper(node.Right, temp.Val)\nnode.Val = temp.Val\n}\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = t.rotate(node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(val) {\nthis.root = this.#removeHelper(this.root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\nif (node === null) return null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val) node.left = this.#removeHelper(node.left, val);\nelse if (val > node.val)\nnode.right = this.#removeHelper(node.right, val);\nelse {\nif (node.left === null || node.right === null) {\nconst child = node.left !== null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child === null) return null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse 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\nlet temp = node.right;\nwhile (temp.left !== null) {\ntemp = temp.left;\n}\nnode.right = this.#removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nthis.#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 */\nnode = this.#rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\nthis.root = this.removeHelper(this.root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\nif (node === null) return null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val) {\nnode.left = this.removeHelper(node.left, val);\n} else if (val > node.val) {\nnode.right = this.removeHelper(node.right, val);\n} else {\nif (node.left === null || node.right === null) {\nconst child = node.left !== null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child === null) {\nreturn null;\n} else {\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nnode = 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\nlet temp = node.right;\nwhile (temp.left !== null) {\ntemp = temp.left;\n}\nnode.right = this.removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nthis.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 */\nnode = this.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\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 removeNode(aVLTree *tree, int val) {\nTreeNode *root = removeHelper(tree->root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\nTreeNode *child, *grandChild;\nif (node == NULL) {\nreturn NULL;\n}\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node->val) {\nnode->left = removeHelper(node->left, val);\n} else if (val > node->val) {\nnode->right = removeHelper(node->right, val);\n} else {\nif (node->left == NULL || node->right == NULL) {\nchild = node->left;\nif (node->right != NULL) {\nchild = node->right;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == NULL) {\nreturn NULL;\n} else {\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nnode = 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\nTreeNode *temp = node->right;\nwhile (temp->left != NULL) {\ntemp = temp->left;\n}\nint tempVal = temp->val;\nnode->right = removeHelper(node->right, temp->val);\nnode->val = tempVal;\n}\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val)\n{\nroot = removeHelper(root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val)\n{\nif (node == null) return null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val)\nnode.left = removeHelper(node.left, val);\nelse if (val > node.val)\nnode.right = removeHelper(node.right, val);\nelse\n{\nif (node.left == null || node.right == null)\n{\nTreeNode? child = node.left != null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == null)\nreturn null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse\nnode = child;\n}\nelse\n{\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\nTreeNode? temp = node.right;\nwhile (temp.left != null)\n{\ntemp = temp.left;\n}\nnode.right = removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.swift
/* \u5220\u9664\u8282\u70b9 */\n@discardableResult\nfunc remove(val: Int) {\nroot = removeHelper(node: root, val: val)\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\nvar node = node\nif node == nil {\nreturn nil\n}\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif val < node!.val {\nnode?.left = removeHelper(node: node?.left, val: val)\n} else if val > node!.val {\nnode?.right = removeHelper(node: node?.right, val: val)\n} else {\nif node?.left == nil || node?.right == nil {\nlet child = node?.left != nil ? node?.left : node?.right\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif child == nil {\nreturn nil\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse {\nnode = 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\nlet temp = node?.right\nwhile temp?.left != nil {\ntemp = temp?.left\n}\nnode?.right = removeHelper(node: node?.right, val: temp!.val)\nnode?.val = temp!.val\n}\n}\nupdateHeight(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 */\nnode = rotate(node: node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\nself.root = self.removeHelper(self.root, val);\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) {\nvar node = node_;\nif (node == null) return null;\n// 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b\nif (val < node.?.val) {\nnode.?.left = self.removeHelper(node.?.left, val);\n} else if (val > node.?.val) {\nnode.?.right = self.removeHelper(node.?.right, val);\n} else {\nif (node.?.left == null or node.?.right == null) {\nvar 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\nif (child == null) {\nreturn null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n} else {\nnode = 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\nvar temp = node.?.right;\nwhile (temp.?.left != null) {\ntemp = temp.?.left;\n}\nnode.?.right = self.removeHelper(node.?.right, temp.?.val);\nnode.?.val = temp.?.val;\n}\n}\nself.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\nnode = self.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
"},{"location":"chapter_tree/avl_tree/#_10","title":"\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/#854-avl","title":"8.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\uff1b
  • \u7528\u4e8e\u6784\u5efa\u6570\u636e\u5e93\u4e2d\u7684\u7d22\u5f15\u7cfb\u7edf\uff1b

\u4e3a\u4ec0\u4e48\u7ea2\u9ed1\u6811\u6bd4 AVL \u6811\u66f4\u53d7\u6b22\u8fce\uff1f

\u7ea2\u9ed1\u6811\u7684\u5e73\u8861\u6761\u4ef6\u76f8\u5bf9\u5bbd\u677e\uff0c\u56e0\u6b64\u5728\u7ea2\u9ed1\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u6240\u9700\u7684\u65cb\u8f6c\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\u5728\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u4e0a\u7684\u5e73\u5747\u6548\u7387\u9ad8\u4e8e AVL \u6811\u3002

"},{"location":"chapter_tree/binary_search_tree/","title":"8.4. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811","text":"

\u300c\u4e8c\u53c9\u641c\u7d22\u6811 Binary Search Tree\u300d\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\uff1a

  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\uff1b
  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. \uff1b

Fig. \u4e8c\u53c9\u641c\u7d22\u6811

"},{"location":"chapter_tree/binary_search_tree/#841","title":"8.4.1. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_search_tree/#_1","title":"\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\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

  • \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 \uff1b
  • \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 \uff1b
  • \u82e5 cur.val = num \uff0c\u8bf4\u660e\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\u5e76\u8fd4\u56de\u8be5\u8282\u70b9\uff1b
<1><2><3><4>

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_tree.java
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\nTreeNode cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num)\ncur = cur.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur.val > num)\ncur = cur.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse\nbreak;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.cpp
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\nTreeNode *cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != nullptr) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur->val < num)\ncur = cur->right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur->val > num)\ncur = cur->left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse\nbreak;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n\"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\ncur: TreeNode | None = self.__root\n# \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur is not None:\n# \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur.val < num:\ncur = cur.right\n# \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelif cur.val > num:\ncur = cur.left\n# \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse:\nbreak\nreturn cur\n
binary_search_tree.go
/* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\nnode := bst.root\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nfor node != nil {\nif node.Val < num {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nnode = node.Right\n} else if node.Val > num {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nnode = node.Left\n} else {\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nbreak\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn node\n}\n
binary_search_tree.js
/* \u67e5\u627e\u8282\u70b9 */\nfunction search(num) {\nlet cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur.val > num) cur = cur.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse break;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.ts
/* \u67e5\u627e\u8282\u70b9 */\nfunction search(num: number): TreeNode | null {\nlet cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\nif (cur.val < num) {\ncur = cur.right; // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n} else if (cur.val > num) {\ncur = cur.left; // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else {\nbreak; // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.c
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(binarySearchTree *bst, int num) {\nTreeNode *cur = bst->root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != NULL) {\nif (cur->val < num) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\ncur = cur->right;\n} else if (cur->val > num) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\ncur = cur->left;\n} else {\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nbreak;\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.cs
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int num)\n{\nTreeNode? cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null)\n{\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur.val > num) cur = cur.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse break;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.swift
/* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\nvar cur = root\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur != nil {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur!.val < num {\ncur = cur?.right\n}\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if cur!.val > num {\ncur = cur?.left\n}\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse {\nbreak\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur\n}\n
binary_search_tree.zig
// \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\nvar cur = self.root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.?.val < num) {\ncur = cur.?.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else if (cur.?.val > num) {\ncur = cur.?.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n} else {\nbreak;\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
"},{"location":"chapter_tree/binary_search_tree/#_2","title":"\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\u5206\u4e3a\u4e24\u6b65\uff1a

  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 \\(\\text{null}\\) \uff09\u65f6\u8df3\u51fa\u5faa\u73af\uff1b
  2. \u5728\u8be5\u4f4d\u7f6e\u63d2\u5165\u8282\u70b9\uff1a\u521d\u59cb\u5316\u8282\u70b9 num \uff0c\u5c06\u8be5\u8282\u70b9\u7f6e\u4e8e \\(\\text{null}\\) \u7684\u4f4d\u7f6e\uff1b

\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

Fig. \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u63d2\u5165\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null)\nreturn;\nTreeNode cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.val == num)\nreturn;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num)\ncur = cur.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur.left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode node = new TreeNode(num);\nif (pre.val < num)\npre.right = node;\nelse\npre.left = node;\n}\n
binary_search_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == nullptr)\nreturn;\nTreeNode *cur = root, *pre = nullptr;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != nullptr) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur->val == num)\nreturn;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur->val < num)\ncur = cur->right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur->left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode *node = new TreeNode(num);\nif (pre->val < num)\npre->right = node;\nelse\npre->left = node;\n}\n
binary_search_tree.py
def insert(self, num: int) -> None:\n\"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n# \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif self.__root is None:\nreturn\n# \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\ncur, pre = self.__root, None\nwhile cur is not None:\n# \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif cur.val == num:\nreturn\npre = cur\n# \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur.val < num:\ncur = cur.right\n# \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse:\ncur = cur.left\n# \u63d2\u5165\u8282\u70b9 val\nnode = TreeNode(num)\nif pre.val < num:\npre.right = node\nelse:\npre.left = node\n
binary_search_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\ncur := bst.root\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\nvar pre *TreeNode = nil\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nfor cur != nil {\nif cur.Val == num {\nreturn\n}\npre = cur\nif cur.Val < num {\ncur = cur.Right\n} else {\ncur = cur.Left\n}\n}\n// \u63d2\u5165\u8282\u70b9\nnode := NewTreeNode(num)\nif pre.Val < num {\npre.Right = node\n} else {\npre.Left = node\n}\n}\n
binary_search_tree.js
/* \u63d2\u5165\u8282\u70b9 */\nfunction insert(num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) return;\nlet cur = root,\npre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.val === num) return;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nlet node = new TreeNode(num);\nif (pre.val < num) pre.right = node;\nelse pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\nfunction insert(num: number): void {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) {\nreturn;\n}\nlet cur = root,\npre: TreeNode | null = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\nif (cur.val === num) {\nreturn; // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n}\npre = cur;\nif (cur.val < num) {\ncur = cur.right as TreeNode; // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n} else {\ncur = cur.left as TreeNode; // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nlet node = new TreeNode(num);\nif (pre!.val < num) {\npre!.right = node;\n} else {\npre!.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\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (bst->root == NULL)\nreturn;\nTreeNode *cur = bst->root, *pre = NULL;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != NULL) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur->val == num) {\nreturn;\n}\npre = cur;\nif (cur->val < num) {\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\ncur = cur->right;\n} else {\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\ncur = cur->left;\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode *node = newTreeNode(num);\nif (pre->val < num) {\npre->right = node;\n} else {\npre->left = node;\n}\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num)\n{\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null) return;\nTreeNode? cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null)\n{\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.val == num) return;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode node = new TreeNode(num);\nif (pre != null)\n{\nif (pre.val < num) pre.right = node;\nelse pre.left = node;\n}\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif root == nil {\nreturn\n}\nvar cur = root\nvar pre: TreeNode?\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur != nil {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif cur!.val == num {\nreturn\n}\npre = cur\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur!.val < num {\ncur = cur?.right\n}\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse {\ncur = cur?.left\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nlet node = TreeNode(x: num)\nif pre!.val < num {\npre?.right = node\n} else {\npre?.left = node\n}\n}\n
binary_search_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (self.root == null) return;\nvar cur = self.root;\nvar pre: ?*inc.TreeNode(T) = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.?.val == num) return;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.?.val < num) {\ncur = cur.?.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else {\ncur = cur.?.left;\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nvar node = try self.mem_allocator.create(inc.TreeNode(T));\nnode.init(num);\nif (pre.?.val < num) {\npre.?.right = node;\n} else {\npre.?.left = node;\n}\n}\n

\u4e3a\u4e86\u63d2\u5165\u8282\u70b9\uff0c\u6211\u4eec\u9700\u8981\u5229\u7528\u8f85\u52a9\u8282\u70b9 pre \u4fdd\u5b58\u4e0a\u4e00\u8f6e\u5faa\u73af\u7684\u8282\u70b9\uff0c\u8fd9\u6837\u5728\u904d\u5386\u81f3 \\(\\text{null}\\) \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

\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":"\u5220\u9664\u8282\u70b9","text":"

\u4e0e\u63d2\u5165\u8282\u70b9\u7c7b\u4f3c\uff0c\u6211\u4eec\u9700\u8981\u5728\u5220\u9664\u64cd\u4f5c\u540e\u7ef4\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\u3002\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5728\u4e8c\u53c9\u6811\u4e2d\u6267\u884c\u67e5\u627e\u64cd\u4f5c\uff0c\u83b7\u53d6\u5f85\u5220\u9664\u8282\u70b9\u3002\u63a5\u4e0b\u6765\uff0c\u6839\u636e\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf\uff0c\u5220\u9664\u64cd\u4f5c\u9700\u5206\u4e3a\u4e09\u79cd\u60c5\u51b5\uff1a

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf \\(= 0\\) \u65f6\uff0c\u8868\u793a\u5f85\u5220\u9664\u8282\u70b9\u662f\u53f6\u8282\u70b9\uff0c\u53ef\u4ee5\u76f4\u63a5\u5220\u9664\u3002

Fig. \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 0\uff09

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf \\(= 1\\) \u65f6\uff0c\u5c06\u5f85\u5220\u9664\u8282\u70b9\u66ff\u6362\u4e3a\u5176\u5b50\u8282\u70b9\u5373\u53ef\u3002

Fig. \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 1\uff09

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf \\(= 2\\) \u65f6\uff0c\u5220\u9664\u64cd\u4f5c\u5206\u4e3a\u4e09\u6b65\uff1a

  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 \uff1b
  2. \u5728\u6811\u4e2d\u9012\u5f52\u5220\u9664\u8282\u70b9 tmp \uff1b
  3. \u7528 tmp \u7684\u503c\u8986\u76d6\u5f85\u5220\u9664\u8282\u70b9\u7684\u503c\uff1b
<1><2><3><4>

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null)\nreturn;\nTreeNode cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val == num)\nbreak;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num)\ncur = cur.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur.left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == null)\nreturn;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left == null || cur.right == null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nTreeNode child = cur.left != null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.left == cur)\npre.left = child;\nelse\npre.right = child;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nTreeNode tmp = cur.right;\nwhile (tmp.left != null) {\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\n}\n}\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\nif (root == nullptr)\nreturn;\nTreeNode *cur = root, *pre = nullptr;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != nullptr) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur->val == num)\nbreak;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur->val < num)\ncur = cur->right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur->left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == nullptr)\nreturn;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur->left == nullptr || cur->right == nullptr) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\nTreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre->left == cur)\npre->left = child;\nelse\npre->right = child;\n// \u91ca\u653e\u5185\u5b58\ndelete cur;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nTreeNode *tmp = cur->right;\nwhile (tmp->left != nullptr) {\ntmp = tmp->left;\n}\nint tmpVal = tmp->val;\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp->val);\n// \u7528 tmp \u8986\u76d6 cur\ncur->val = tmpVal;\n}\n}\n
binary_search_tree.py
def remove(self, num: int) -> None:\n\"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n# \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif self.__root is None:\nreturn\n# \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\ncur, pre = self.__root, None\nwhile cur is not None:\n# \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif cur.val == num:\nbreak\npre = cur\n# \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur.val < num:\ncur = cur.right\n# \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse:\ncur = cur.left\n# \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif cur is None:\nreturn\n# \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif 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\nchild = cur.left or cur.right\n# \u5220\u9664\u8282\u70b9 cur\nif pre.left == cur:\npre.left = child\nelse:\npre.right = child\n# \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse:\n# \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\ntmp: TreeNode = cur.right\nwhile tmp.left is not None:\ntmp = tmp.left\n# \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nself.remove(tmp.val)\n# \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val\n
binary_search_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\ncur := bst.root\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\nvar pre *TreeNode = nil\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nfor cur != nil {\nif cur.Val == num {\nbreak\n}\npre = cur\nif cur.Val < num {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\ncur = cur.Right\n} else {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\ncur = cur.Left\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\nif cur.Left == nil || cur.Right == nil {\nvar child *TreeNode = nil\n// \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\nif cur.Left != nil {\nchild = cur.Left\n} else {\nchild = cur.Right\n}\n// \u5c06\u5b50\u8282\u70b9\u66ff\u6362\u4e3a\u5f85\u5220\u9664\u8282\u70b9\nif pre.Left == cur {\npre.Left = child\n} else {\npre.Right = 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\ntmp := cur.Right\nfor tmp.Left != nil {\ntmp = tmp.Left\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nbst.remove(tmp.Val)\n// \u7528 tmp \u8986\u76d6 cur\ncur.Val = tmp.Val\n}\n}\n
binary_search_tree.js
/* \u5220\u9664\u8282\u70b9 */\nfunction remove(num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) return;\nlet cur = root,\npre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val === num) break;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur === null) return;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left === null || cur.right === null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nlet child = cur.left !== null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.left === cur) pre.left = child;\nelse pre.right = child;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nlet tmp = cur.right;\nwhile (tmp.left !== null) {\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\n}\n}\n
binary_search_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nfunction remove(num: number): void {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) {\nreturn;\n}\nlet cur = root,\npre: TreeNode | null = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val === num) {\nbreak;\n}\npre = cur;\nif (cur.val < num) {\ncur = cur.right as TreeNode; // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n} else {\ncur = cur.left as TreeNode; // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur === null) {\nreturn;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left === null || cur.right === null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nlet child = cur.left !== null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre!.left === cur) {\npre!.left = child;\n} else {\npre!.right = child;\n}\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nlet tmp = cur.right;\nwhile (tmp.left !== null) {\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp!.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\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 removeNode(binarySearchTree *bst, int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (bst->root == NULL)\nreturn;\nTreeNode *cur = bst->root, *pre = NULL;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != NULL) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur->val == num)\nbreak;\npre = cur;\nif (cur->val < num) {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\ncur = cur->right;\n} else {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\ncur = cur->left;\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == NULL)\nreturn;\n// \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\nif (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\nTreeNode *child = cur->left != NULL ? cur->left : cur->right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre->left == cur) {\npre->left = child;\n} else {\npre->right = 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\nTreeNode *tmp = cur->right;\nwhile (tmp->left != NULL) {\ntmp = tmp->left;\n}\nint tmpVal = tmp->val;\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremoveNode(bst, tmp->val);\n// \u7528 tmp \u8986\u76d6 cur\ncur->val = tmpVal;\n}\n}\n
binary_search_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num)\n{\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null) return;\nTreeNode? cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null)\n{\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val == num) break;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == null || pre == null) return;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left == null || cur.right == null)\n{\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nTreeNode? child = cur.left != null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.left == cur)\n{\npre.left = child;\n}\nelse\n{\npre.right = child;\n}\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse\n{\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nTreeNode? tmp = cur.right;\nwhile (tmp.left != null)\n{\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\n}\n}\n
binary_search_tree.swift
/* \u5220\u9664\u8282\u70b9 */\n@discardableResult\nfunc remove(num: Int) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif root == nil {\nreturn\n}\nvar cur = root\nvar pre: TreeNode?\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur != nil {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif cur!.val == num {\nbreak\n}\npre = cur\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur!.val < num {\ncur = cur?.right\n}\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse {\ncur = cur?.left\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif cur?.left == nil || cur?.right == nil {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nlet child = cur?.left != nil ? cur?.left : cur?.right\n// \u5220\u9664\u8282\u70b9 cur\nif pre?.left === cur {\npre?.left = child\n} else {\npre?.right = child\n}\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nlet tmp = cur?.right\nwhile tmp?.left != nil {\ntmp = tmp?.left\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(num: tmp!.val)\n// \u7528 tmp \u8986\u76d6 cur\ncur?.val = tmp!.val\n}\n}\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\nif (self.root == null) return;\nvar cur = self.root;\nvar pre: ?*inc.TreeNode(T) = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.?.val == num) break;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.?.val < num) {\ncur = cur.?.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else {\ncur = cur.?.left;\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == null) return;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.?.left == null or cur.?.right == null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nvar child = if (cur.?.left != null) cur.?.left else cur.?.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.?.left == cur) {\npre.?.left = child;\n} else {\npre.?.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\nvar tmp = cur.?.right;\nwhile (tmp.?.left != null) {\ntmp = tmp.?.left;\n}\nvar tmpVal = tmp.?.val;\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n_ = self.remove(tmp.?.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.?.val = tmpVal;\n}\n}\n
"},{"location":"chapter_tree/binary_search_tree/#_4","title":"\u6392\u5e8f","text":"

\u6211\u4eec\u77e5\u9053\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\u56e0\u6b64\uff0c\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\u9700\u989d\u5916\u6392\u5e8f\uff0c\u975e\u5e38\u9ad8\u6548\u3002

Fig. \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217

"},{"location":"chapter_tree/binary_search_tree/#842","title":"8.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\u53ef\u77e5\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\u8868\u73b0\u3002\u53ea\u6709\u5728\u9ad8\u9891\u6dfb\u52a0\u3001\u4f4e\u9891\u67e5\u627e\u5220\u9664\u7684\u6570\u636e\u9002\u7528\u573a\u666f\u4e0b\uff0c\u6570\u7ec4\u6bd4\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387\u66f4\u9ad8\u3002

\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\u94fe\u8868\uff0c\u8fd9\u65f6\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4f1a\u9000\u5316\u4e3a \\(O(n)\\) \u3002

Fig. \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5e73\u8861\u4e0e\u9000\u5316

"},{"location":"chapter_tree/binary_search_tree/#843","title":"8.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":"8.1. \u00a0 \u4e8c\u53c9\u6811","text":"

\u300c\u4e8c\u53c9\u6811 Binary Tree\u300d\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4ee3\u8868\u7740\u7956\u5148\u4e0e\u540e\u4ee3\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff0c\u4f53\u73b0\u7740\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\u4e00\u4e2a\u300c\u503c\u300d\u548c\u4e24\u4e2a\u300c\u6307\u9488\u300d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nint val;         // \u8282\u70b9\u503c\nTreeNode left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nTreeNode right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nTreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\nint val;          // \u8282\u70b9\u503c\nTreeNode *left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nTreeNode *right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nTreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
class TreeNode:\n\"\"\"\u4e8c\u53c9\u6811\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                   # \u8282\u70b9\u503c\nself.left: Optional[TreeNode] = None  # \u5de6\u5b50\u8282\u70b9\u6307\u9488\nself.right: Optional[TreeNode] = None # \u53f3\u5b50\u8282\u70b9\u6307\u9488\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\nVal   int\nLeft  *TreeNode\nRight *TreeNode\n}\n/* \u8282\u70b9\u521d\u59cb\u5316\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\nreturn &TreeNode{\nLeft:  nil,\nRight: nil,\nVal:   v,\n}\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nfunction TreeNode(val, left, right) {\nthis.val = (val === undefined ? 0 : val); // \u8282\u70b9\u503c\nthis.left = (left === undefined ? null : left); // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nthis.right = (right === undefined ? null : right); // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nval: number;\nleft: TreeNode | null;\nright: TreeNode | null;\nconstructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\nthis.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\nthis.left = left === undefined ? null : left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nthis.right = right === undefined ? null : right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n}\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\nint val;                // \u8282\u70b9\u503c\nint height;             // \u8282\u70b9\u9ad8\u5ea6\nstruct TreeNode *left;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nstruct TreeNode *right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n};\ntypedef struct TreeNode TreeNode;\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\nTreeNode *node;\nnode = (TreeNode *)malloc(sizeof(TreeNode));\nnode->val = val;\nnode->height = 0;\nnode->left = NULL;\nnode->right = NULL;\nreturn node;\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nint val;          // \u8282\u70b9\u503c\nTreeNode? left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nTreeNode? right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nTreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nvar val: Int // \u8282\u70b9\u503c\nvar left: TreeNode? // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nvar right: TreeNode? // \u53f3\u5b50\u8282\u70b9\u6307\u9488\ninit(x: Int) {\nval = x\n}\n}\n
\n

\u8282\u70b9\u7684\u4e24\u4e2a\u6307\u9488\u5206\u522b\u6307\u5411\u300c\u5de6\u5b50\u8282\u70b9\u300d\u548c\u300c\u53f3\u5b50\u8282\u70b9\u300d\uff0c\u540c\u65f6\u8be5\u8282\u70b9\u88ab\u79f0\u4e3a\u8fd9\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u300c\u7236\u8282\u70b9\u300d\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\u300c\u5de6\u5b50\u6811\u300d\uff0c\u540c\u7406\u53ef\u5f97\u300c\u53f3\u5b50\u6811\u300d\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\u4f8b\u5982\uff0c\u5728\u4ee5\u4e0b\u793a\u4f8b\u4e2d\uff0c\u82e5\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

Fig. \u7236\u8282\u70b9\u3001\u5b50\u8282\u70b9\u3001\u5b50\u6811

"},{"location":"chapter_tree/binary_tree/#811","title":"8.1.1. \u00a0 \u4e8c\u53c9\u6811\u5e38\u89c1\u672f\u8bed","text":"

\u4e8c\u53c9\u6811\u6d89\u53ca\u7684\u672f\u8bed\u8f83\u591a\uff0c\u5efa\u8bae\u5c3d\u91cf\u7406\u89e3\u5e76\u8bb0\u4f4f\u3002

  • \u300c\u6839\u8282\u70b9 Root Node\u300d\uff1a\u4f4d\u4e8e\u4e8c\u53c9\u6811\u9876\u5c42\u7684\u8282\u70b9\uff0c\u6ca1\u6709\u7236\u8282\u70b9\uff1b
  • \u300c\u53f6\u8282\u70b9 Leaf Node\u300d\uff1a\u6ca1\u6709\u5b50\u8282\u70b9\u7684\u8282\u70b9\uff0c\u5176\u4e24\u4e2a\u6307\u9488\u5747\u6307\u5411 \\(\\text{null}\\) \uff1b
  • \u8282\u70b9\u7684\u300c\u5c42 Level\u300d\uff1a\u4ece\u9876\u81f3\u5e95\u9012\u589e\uff0c\u6839\u8282\u70b9\u6240\u5728\u5c42\u4e3a 1 \uff1b
  • \u8282\u70b9\u7684\u300c\u5ea6 Degree\u300d\uff1a\u8282\u70b9\u7684\u5b50\u8282\u70b9\u7684\u6570\u91cf\u3002\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u5ea6\u7684\u8303\u56f4\u662f 0, 1, 2 \uff1b
  • \u300c\u8fb9 Edge\u300d\uff1a\u8fde\u63a5\u4e24\u4e2a\u8282\u70b9\u7684\u7ebf\u6bb5\uff0c\u5373\u8282\u70b9\u6307\u9488\uff1b
  • \u4e8c\u53c9\u6811\u7684\u300c\u9ad8\u5ea6\u300d\uff1a\u4ece\u6839\u8282\u70b9\u5230\u6700\u8fdc\u53f6\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\uff1b
  • \u8282\u70b9\u7684\u300c\u6df1\u5ea6 Depth\u300d \uff1a\u4ece\u6839\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\uff1b
  • \u8282\u70b9\u7684\u300c\u9ad8\u5ea6 Height\u300d\uff1a\u4ece\u6700\u8fdc\u53f6\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\uff1b

Fig. \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed

\u9ad8\u5ea6\u4e0e\u6df1\u5ea6\u7684\u5b9a\u4e49

\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u300c\u9ad8\u5ea6\u300d\u548c\u300c\u6df1\u5ea6\u300d\u5b9a\u4e49\u4e3a\u201c\u8d70\u8fc7\u8fb9\u7684\u6570\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u9898\u76ee\u6216\u6559\u6750\u53ef\u80fd\u4f1a\u5c06\u5176\u5b9a\u4e49\u4e3a\u201c\u8d70\u8fc7\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/#812","title":"8.1.2. \u00a0 \u4e8c\u53c9\u6811\u57fa\u672c\u64cd\u4f5c","text":"

\u521d\u59cb\u5316\u4e8c\u53c9\u6811\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u8282\u70b9\uff0c\u7136\u540e\u6784\u5efa\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\u5f15\u7528\u6307\u5411\uff08\u5373\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\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
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\u5f15\u7528\u6307\u5411\uff08\u5373\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\u5f15\u7528\u6307\u5411\uff08\u5373\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),\nn2 = new TreeNode(2),\nn3 = new TreeNode(3),\nn4 = new TreeNode(4),\nn5 = new TreeNode(5);\n// \u6784\u5efa\u5f15\u7528\u6307\u5411\uff08\u5373\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),\nn2 = new TreeNode(2),\nn3 = new TreeNode(3),\nn4 = new TreeNode(4),\nn5 = new TreeNode(5);\n// \u6784\u5efa\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = 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\u5f15\u7528\u6307\u5411\uff08\u5373\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 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\u5f15\u7528\u6307\u5411\uff08\u5373\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\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.zig
\n

\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u901a\u8fc7\u4fee\u6539\u6307\u9488\u6765\u5b9e\u73b0\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u3002

Fig. \u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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.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.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.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.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.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.cs
/* \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.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.zig
\n

Note

\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\u64cd\u4f5c\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/#813","title":"8.1.3. \u00a0 \u5e38\u89c1\u4e8c\u53c9\u6811\u7c7b\u578b","text":""},{"location":"chapter_tree/binary_tree/#_1","title":"\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u300c\u5b8c\u7f8e\u4e8c\u53c9\u6811 Perfect Binary Tree\u300d\u9664\u4e86\u6700\u5e95\u5c42\u5916\uff0c\u5176\u4f59\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\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

\u5728\u4e2d\u6587\u793e\u533a\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u5e38\u88ab\u79f0\u4e3a\u300c\u6ee1\u4e8c\u53c9\u6811\u300d\uff0c\u8bf7\u6ce8\u610f\u533a\u5206\u3002

Fig. \u5b8c\u7f8e\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#_2","title":"\u5b8c\u5168\u4e8c\u53c9\u6811","text":"

\u300c\u5b8c\u5168\u4e8c\u53c9\u6811 Complete Binary Tree\u300d\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

Fig. \u5b8c\u5168\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#_3","title":"\u5b8c\u6ee1\u4e8c\u53c9\u6811","text":"

\u300c\u5b8c\u6ee1\u4e8c\u53c9\u6811 Full Binary Tree\u300d\u9664\u4e86\u53f6\u8282\u70b9\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\u3002

Fig. \u5b8c\u6ee1\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#_4","title":"\u5e73\u8861\u4e8c\u53c9\u6811","text":"

\u300c\u5e73\u8861\u4e8c\u53c9\u6811 Balanced Binary Tree\u300d\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

Fig. \u5e73\u8861\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#814","title":"8.1.4. \u00a0 \u4e8c\u53c9\u6811\u7684\u9000\u5316","text":"

\u5f53\u4e8c\u53c9\u6811\u7684\u6bcf\u5c42\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u65f6\uff0c\u8fbe\u5230\u300c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u300d\uff1b\u800c\u5f53\u6240\u6709\u8282\u70b9\u90fd\u504f\u5411\u4e00\u4fa7\u65f6\uff0c\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u300c\u94fe\u8868\u300d\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\uff1b
  • \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)\\) \uff1b

Fig. \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u4e0e\u6700\u5dee\u7ed3\u6784

\u5982\u4e0b\u8868\u6240\u793a\uff0c\u5728\u6700\u4f73\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\u6216\u6781\u5c0f\u503c\u3002

\u5b8c\u7f8e\u4e8c\u53c9\u6811 \u94fe\u8868 \u7b2c \\(i\\) \u5c42\u7684\u8282\u70b9\u6570\u91cf \\(2^{i-1}\\) \\(1\\) \u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \u65f6\u7684\u53f6\u8282\u70b9\u6570\u91cf \\(2^h\\) \\(1\\) \u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \u65f6\u7684\u8282\u70b9\u603b\u6570 \\(2^{h+1} - 1\\) \\(h + 1\\) \u6811\u7684\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \u65f6\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"8.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/#821","title":"8.2.1. \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

\u300c\u5c42\u5e8f\u904d\u5386 Level-Order Traversal\u300d\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\u300c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 Breadth-First Traversal\u300d\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u641c\u7d22\u65b9\u5f0f\u3002

Fig. \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386

"},{"location":"chapter_tree/binary_tree_traversal/#_1","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u901a\u5e38\u501f\u52a9\u300c\u961f\u5217\u300d\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nQueue<TreeNode> queue = new LinkedList<>() {{ add(root); }};\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nList<Integer> list = new ArrayList<>();\nwhile (!queue.isEmpty()) {\nTreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\nlist.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left != null)\nqueue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node.right != null)\nqueue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn list;\n}\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\nqueue<TreeNode *> queue;\nqueue.push(root);\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nvector<int> vec;\nwhile (!queue.empty()) {\nTreeNode *node = queue.front();\nqueue.pop();              // \u961f\u5217\u51fa\u961f\nvec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node->left != nullptr)\nqueue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node->right != nullptr)\nqueue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn vec;\n}\n
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\nqueue: deque[TreeNode] = deque()\nqueue.append(root)\n# \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nres: list[int] = []\nwhile queue:\nnode: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\nres.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\nif node.left is not None:\nqueue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif node.right is not None:\nqueue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\nreturn res\n
binary_tree_bfs.go
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []int {\n// \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\nqueue := list.New()\nqueue.PushBack(root)\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nnums := make([]int, 0)\nfor queue.Len() > 0 {\n// \u961f\u5217\u51fa\u961f\nnode := queue.Remove(queue.Front()).(*TreeNode)\n// \u4fdd\u5b58\u8282\u70b9\u503c\nnums = append(nums, node.Val)\nif node.Left != nil {\n// \u5de6\u5b50\u8282\u70b9\u5165\u961f\nqueue.PushBack(node.Left)\n}\nif node.Right != nil {\n// \u53f3\u5b50\u8282\u70b9\u5165\u961f\nqueue.PushBack(node.Right)\n}\n}\nreturn nums\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\nconst queue = [root];\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nconst list = [];\nwhile (queue.length) {\nlet node = queue.shift(); // \u961f\u5217\u51fa\u961f\nlist.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn 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\nconst queue = [root];\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nconst list: number[] = [];\nwhile (queue.length) {\nlet node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\nlist.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left) {\nqueue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n}\nif (node.right) {\nqueue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\n}\nreturn list;\n}\n
binary_tree_bfs.c
/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n/* \u8f85\u52a9\u961f\u5217 */\nint front, rear;\nint index, *arr;\nTreeNode *node;\nTreeNode **queue;\n/* \u8f85\u52a9\u961f\u5217 */\nqueue = (TreeNode **)malloc(sizeof(TreeNode) * MAX_NODE_SIZE);\n// \u961f\u5217\u6307\u9488\nfront = 0, rear = 0;\n// \u52a0\u5165\u6839\u8282\u70b9\nqueue[rear++] = root;\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n/* \u8f85\u52a9\u6570\u7ec4 */\narr = (int *)malloc(sizeof(int) * MAX_NODE_SIZE);\n// \u6570\u7ec4\u6307\u9488\nindex = 0;\nwhile (front < rear) {\n// \u961f\u5217\u51fa\u961f\nnode = queue[front++];\n// \u4fdd\u5b58\u8282\u70b9\u503c\narr[index++] = node->val;\nif (node->left != NULL) {\n// \u5de6\u5b50\u8282\u70b9\u5165\u961f\nqueue[rear++] = node->left;\n}\nif (node->right != NULL) {\n// \u53f3\u5b50\u8282\u70b9\u5165\u961f\nqueue[rear++] = node->right;\n}\n}\n// \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n*size = index;\narr = realloc(arr, sizeof(int) * (*size));\nreturn arr;\n}\n
binary_tree_bfs.cs
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode root)\n{\n// \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\nQueue<TreeNode> queue = new();\nqueue.Enqueue(root);\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nList<int> list = new();\nwhile (queue.Count != 0)\n{\nTreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\nlist.Add(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left != null)\nqueue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node.right != null)\nqueue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn list;\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\nvar queue: [TreeNode] = [root]\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nvar list: [Int] = []\nwhile !queue.isEmpty {\nlet node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\nlist.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\nif let left = node.left {\nqueue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n}\nif let right = node.right {\nqueue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\n}\nreturn list\n}\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\nconst L = std.TailQueue(*inc.TreeNode(T));\nvar queue = L{};\nvar root_node = try mem_allocator.create(L.Node);\nroot_node.data = root;\nqueue.append(root_node); // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nvar list = std.ArrayList(T).init(std.heap.page_allocator);\nwhile (queue.len > 0) {\nvar queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\nvar node = queue_node.data;\ntry list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left != null) {\nvar tmp_node = try mem_allocator.create(L.Node);\ntmp_node.data = node.left.?;\nqueue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n}\nif (node.right != null) {\nvar tmp_node = try mem_allocator.create(L.Node);\ntmp_node.data = node.right.?;\nqueue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}        }\nreturn list;\n}\n
"},{"location":"chapter_tree/binary_tree_traversal/#_2","title":"\u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\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\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 \\(\\frac{n + 1}{2}\\) \u4e2a\u8282\u70b9\uff0c\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#822","title":"8.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\u300c\u6df1\u5ea6\u4f18\u5148\u904d\u5386 Depth-First Traversal\u300d\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

\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5de6\u4fa7\u662f\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u793a\u610f\u56fe\uff0c\u53f3\u4e0a\u65b9\u662f\u5bf9\u5e94\u7684\u9012\u5f52\u5b9e\u73b0\u4ee3\u7801\u3002\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5c31\u50cf\u662f\u7ed5\u7740\u6574\u4e2a\u4e8c\u53c9\u6811\u7684\u5916\u56f4\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\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

Fig. \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u524d\u3001\u4e2d\u3001\u540e\u5e8f\u904d\u5386

\u4f4d\u7f6e \u542b\u4e49 \u6b64\u5904\u8bbf\u95ee\u8282\u70b9\u65f6\u5bf9\u5e94 \u6a59\u8272\u5706\u5708\u5904 \u521a\u8fdb\u5165\u6b64\u8282\u70b9\uff0c\u5373\u5c06\u8bbf\u95ee\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u6811 \u524d\u5e8f\u904d\u5386 Pre-Order Traversal \u84dd\u8272\u5706\u5708\u5904 \u5df2\u8bbf\u95ee\u5b8c\u5de6\u5b50\u6811\uff0c\u5373\u5c06\u8bbf\u95ee\u53f3\u5b50\u6811 \u4e2d\u5e8f\u904d\u5386 In-Order Traversal \u7d2b\u8272\u5706\u5708\u5904 \u5df2\u8bbf\u95ee\u5b8c\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff0c\u5373\u5c06\u8fd4\u56de \u540e\u5e8f\u904d\u5386 Post-Order Traversal"},{"location":"chapter_tree/binary_tree_traversal/#_3","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_tree_dfs.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\nif (root == null)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.add(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\nif (root == null)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.add(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\nif (root == null)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.add(root.val);\n}\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\nif (root == nullptr)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nvec.push_back(root->val);\npreOrder(root->left);\npreOrder(root->right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\nif (root == nullptr)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root->left);\nvec.push_back(root->val);\ninOrder(root->right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\nif (root == nullptr)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root->left);\npostOrder(root->right);\nvec.push_back(root->val);\n}\n
binary_tree_dfs.py
def pre_order(root: TreeNode | None) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nres.append(root.val)\npre_order(root=root.left)\npre_order(root=root.right)\ndef in_order(root: TreeNode | None) -> None:\n\"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\nin_order(root=root.left)\nres.append(root.val)\nin_order(root=root.right)\ndef post_order(root: TreeNode | None) -> None:\n\"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npost_order(root=root.left)\npost_order(root=root.right)\nres.append(root.val)\n
binary_tree_dfs.go
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\nif node == nil {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nnums = append(nums, node.Val)\npreOrder(node.Left)\npreOrder(node.Right)\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\nif node == nil {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(node.Left)\nnums = append(nums, node.Val)\ninOrder(node.Right)\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\nif node == nil {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(node.Left)\npostOrder(node.Right)\nnums = append(nums, node.Val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\nif (root === null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.push(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\nif (root === null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.push(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\nif (root === null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\nif (root === null) {\nreturn;\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.push(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\nif (root === null) {\nreturn;\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.push(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\nif (root === null) {\nreturn;\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.push(root.val);\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\nif (root == NULL)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\narr[(*size)++] = root->val;\npreOrder(root->left, size);\npreOrder(root->right, size);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\nif (root == NULL)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root->left, size);\narr[(*size)++] = root->val;\ninOrder(root->right, size);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\nif (root == NULL)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root->left, size);\npostOrder(root->right, size);\narr[(*size)++] = root->val;\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? root)\n{\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.Add(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? root)\n{\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.Add(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? root)\n{\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.Add(root.val);\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.append(root.val)\npreOrder(root: root.left)\npreOrder(root: root.right)\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root: root.left)\nlist.append(root.val)\ninOrder(root: root.right)\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root: root.left)\npostOrder(root: root.right)\nlist.append(root.val)\n}\n
binary_tree_dfs.zig
// \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\ntry list.append(root.?.val);\ntry preOrder(T, root.?.left);\ntry preOrder(T, root.?.right);\n}\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ntry inOrder(T, root.?.left);\ntry list.append(root.?.val);\ntry inOrder(T, root.?.right);\n}\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\ntry postOrder(T, root.?.left);\ntry postOrder(T, root.?.right);\ntry list.append(root.?.val);\n}\n

Note

\u4f7f\u7528\u5faa\u73af\u4e00\u6837\u53ef\u4ee5\u5b9e\u73b0\u524d\u3001\u4e2d\u3001\u540e\u5e8f\u904d\u5386\uff0c\u4f46\u4ee3\u7801\u76f8\u5bf9\u7e41\u7410\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#_4","title":"\u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\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\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":"8.6. \u00a0 \u5c0f\u7ed3","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\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\u201d\u7684\u5206\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\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u5934\u7ee7\u7eed\u201d\u7684\u56de\u6eaf\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\u4e3a\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5b83\u901a\u8fc7\u65cb\u8f6c\u64cd\u4f5c\uff0c\u786e\u4fdd\u5728\u4e0d\u65ad\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\u540e\uff0c\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
"}]} \ No newline at end of file +{"config":{"lang":["ja"],"separator":"[\\s\\-\uff0c\u3002]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"Home","text":"

\u300a Hello \u7b97\u6cd5 \u300b

\u52a8\u753b\u56fe\u89e3\u3001\u80fd\u8fd0\u884c\u3001\u53ef\u63d0\u95ee\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5feb\u901f\u5165\u95e8\u6559\u7a0b

@Krahets

\u63a8\u8350\u8bed

Quote

\u201c\u4e00\u672c\u901a\u4fd7\u6613\u61c2\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5165\u95e8\u4e66\uff0c\u5f15\u5bfc\u8bfb\u8005\u624b\u8111\u5e76\u7528\u5730\u5b66\u4e60\uff0c\u5f3a\u70c8\u63a8\u8350\u7b97\u6cd5\u521d\u5b66\u8005\u9605\u8bfb\u3002\u201d

\u2014\u2014 \u9093\u4fca\u8f89\uff0c\u6e05\u534e\u5927\u5b66\u8ba1\u7b97\u673a\u7cfb\u6559\u6388

Quote

\u201c\u5982\u679c\u6211\u5f53\u5e74\u5b66\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u65f6\u5019\u6709\u300aHello \u7b97\u6cd5\u300b\uff0c\u5b66\u8d77\u6765\u5e94\u8be5\u4f1a\u7b80\u5355 10 \u500d\uff01\u201d

\u2014\u2014 \u674e\u6c90\uff0c\u4e9a\u9a6c\u900a\u8d44\u6df1\u9996\u5e2d\u79d1\u5b66\u5bb6

\u300c\u5168\u4e66\u52a8\u753b\u56fe\u89e3\u300d

\u5185\u5bb9\u6e05\u6670\u6613\u61c2\u3001\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\u7535\u8111\u3001\u5e73\u677f\u3001\u624b\u673a\u5168\u7ec8\u7aef\u9605\u8bfb

\"A picture is worth a thousand words.\"

\u201c\u4e00\u56fe\u80dc\u5343\u8a00\u201d

\u300c\u4ee3\u7801\u4e00\u952e\u8fd0\u884c\u300d

\u63d0\u4f9b\u5404\u4e2a\u7b97\u6cd5\u4e0e\u6570\u636e\u7ed3\u6784\u7684\u7b80\u6d01\u5b9e\u73b0\u4e0e\u6d4b\u8bd5\u6837\u4f8b\uff0c\u7686\u53ef\u76f4\u63a5\u8fd0\u884c\u652f\u6301 Java, C++, Python, Go, JS, TS, C#, Swift, Zig \u7b49\u8bed\u8a00

\"Talk is cheap. Show me the code.\"

\u201c\u5c11\u5439\u725b\uff0c\u770b\u4ee3\u7801\u201d

\u300c\u53ef\u8ba8\u8bba\u4e0e\u63d0\u95ee\u300d

\u9f13\u52b1\u5c0f\u4f19\u4f34\u4eec\u4e92\u5e2e\u4e92\u52a9\u3001\u5171\u540c\u6210\u957f\u63d0\u95ee\u4e0e\u8bc4\u8bba\u4e00\u822c\u80fd\u5728\u4e24\u65e5\u5185\u5f97\u5230\u56de\u590d

\u201c\u8ffd\u98ce\u8d76\u6708\u83ab\u505c\u7559\uff0c\u5e73\u829c\u5c3d\u5904\u662f\u6625\u5c71\u201d

\u4e00\u8d77\u52a0\u6cb9\uff01

\u5e8f

\u4e24\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u300a\u5251\u6307 Offer\u300b\u7cfb\u5217\u9898\u89e3\uff0c\u53d7\u5230\u4e86\u8bb8\u591a\u670b\u53cb\u7684\u559c\u7231\u4e0e\u652f\u6301\u3002\u5728\u6b64\u671f\u95f4\uff0c\u6211\u56de\u7b54\u4e86\u4f17\u591a\u8bfb\u8005\u7684\u8bc4\u8bba\u95ee\u9898\uff0c\u5176\u4e2d\u6700\u5e38\u89c1\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u201c\u5982\u4f55\u5165\u95e8\u5b66\u4e60\u7b97\u6cd5\u201d\u3002\u6211\u9010\u6e10\u4e5f\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\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\uff0c\u5237\u9898\u5c31\u5982\u540c\u73a9\u201c\u626b\u96f7\u201d\u6e38\u620f\uff0c\u81ea\u5b66\u80fd\u529b\u5f3a\u7684\u540c\u5b66\u80fd\u591f\u987a\u5229\u5730\u5c06\u5730\u96f7\u9010\u4e2a\u6392\u6389\uff0c\u800c\u57fa\u7840\u4e0d\u8db3\u7684\u540c\u5b66\u5f88\u53ef\u80fd\u88ab\u70b8\u7684\u6ee1\u5934\u662f\u5305\uff0c\u5e76\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7f29\u3002\u901a\u8bfb\u6559\u6750\u4e66\u7c4d\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u505a\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u9762\u5411\u6c42\u804c\u7684\u540c\u5b66\u6765\u8bf4\uff0c\u6bd5\u4e1a\u5b63\u3001\u6295\u9012\u7b80\u5386\u3001\u51c6\u5907\u7b14\u8bd5\u9762\u8bd5\u5df2\u7ecf\u5360\u636e\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u539a\u91cd\u7684\u4e66\u7c4d\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\u627e\u5230\u4e86\u4f60\u3002\u672c\u4e66\u662f\u6211\u5bf9\u6b64\u95ee\u9898\u7684\u7ed9\u51fa\u7684\u7b54\u6848\uff0c\u867d\u7136\u4e0d\u4e00\u5b9a\u6b63\u786e\uff0c\u4f46\u81f3\u5c11\u662f\u4e00\u6b21\u79ef\u6781\u7684\u5c1d\u8bd5\u3002\u8fd9\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\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\u5e94\u5bf9\u5237\u9898\u548c\u9605\u8bfb\u6587\u732e\uff0c\u9010\u6b65\u6784\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8bc6\u4f53\u7cfb\u3002

\u4f5c\u8005\u7b80\u4ecb

\u9773\u5b87\u680b (Krahets)\uff0c\u5927\u5382\u9ad8\u7ea7\u7b97\u6cd5\u5de5\u7a0b\u5e08\uff0c\u4e0a\u6d77\u4ea4\u901a\u5927\u5b66\u7855\u58eb\u3002\u529b\u6263\uff08LeetCode\uff09\u5168\u7f51\u9605\u8bfb\u91cf\u6700\u9ad8\u535a\u4e3b\uff0c\u5176 LeetBook\u300a\u56fe\u89e3\u7b97\u6cd5\u6570\u636e\u7ed3\u6784\u300b\u5df2\u88ab\u8ba2\u9605 22 \u4e07\u672c\u3002

\u81f4\u8c22

\u672c\u4e66\u5728\u5f00\u6e90\u793e\u533a\u4f17\u591a\u8d21\u732e\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65ad\u6210\u957f\u3002\u611f\u8c22\u6bcf\u4e00\u4f4d\u6295\u5165\u65f6\u95f4\u4e0e\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u662f\u4ed6\u4eec\u65e0\u79c1\u5949\u732e\u4f7f\u8fd9\u672c\u4e66\u8d8a\u53d8\u8d8a\u597d\uff0c\u4ed6\u4eec\u662f\uff08\u6309\u7167 GitHub \u81ea\u52a8\u751f\u6210\u7684\u987a\u5e8f\uff09\uff1a

\u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 justin\u2010tse, krahets, nuomi1, Reanon, sjinzh \u5b8c\u6210\uff0c\u611f\u8c22\u4ed6\u4eec\u7684\u8f9b\u52e4\u4ed8\u51fa\uff01

justin-tseJS / TS krahetsJava / Python nuomi1Swift ReanonGo / C sjinzhRust / Zig"},{"location":"chapter_appendix/contribution/","title":"14.2. \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c","text":"

\u5f00\u6e90\u7684\u9b45\u529b

\u7eb8\u8d28\u4e66\u7c4d\u7684\u4e24\u6b21\u5370\u5237\u7684\u95f4\u9694\u65f6\u95f4\u5f80\u5f80\u9700\u8981\u6570\u5e74\uff0c\u5185\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002\u4f46\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

\u7531\u4e8e\u4f5c\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\u5931\u6548\u94fe\u63a5\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\u5e2e\u52a9\u5176\u4ed6\u8bfb\u8005\u83b7\u5f97\u66f4\u4f18\u8d28\u7684\u5b66\u4e60\u8d44\u6e90\u3002\u6240\u6709\u64b0\u7a3f\u4eba\u5c06\u5728\u4ed3\u5e93\u548c\u7f51\u7ad9\u4e3b\u9875\u4e0a\u5c55\u793a\uff0c\u4ee5\u611f\u8c22\u4ed6\u4eec\u5bf9\u5f00\u6e90\u793e\u533a\u7684\u65e0\u79c1\u5949\u732e\uff01

"},{"location":"chapter_appendix/contribution/#1421","title":"14.2.1. \u00a0 \u5185\u5bb9\u5fae\u8c03","text":"

\u5728\u6bcf\u4e2a\u9875\u9762\u7684\u53f3\u4e0a\u89d2\u6709\u4e00\u4e2a\u300c\u7f16\u8f91\u300d\u56fe\u6807\uff0c\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u4fee\u6539\u6587\u672c\u6216\u4ee3\u7801\uff1a

  1. \u70b9\u51fb\u7f16\u8f91\u6309\u94ae\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u4ed3\u5e93\u201d\u7684\u63d0\u793a\uff0c\u8bf7\u540c\u610f\u8be5\u64cd\u4f5c\uff1b
  2. \u4fee\u6539 Markdown \u6e90\u6587\u4ef6\u5185\u5bb9\uff0c\u5e76\u786e\u4fdd\u5185\u5bb9\u6b63\u786e\uff0c\u540c\u65f6\u5c3d\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7edf\u4e00\uff1b
  3. \u5728\u9875\u9762\u5e95\u90e8\u586b\u5199\u4fee\u6539\u8bf4\u660e\uff0c\u7136\u540e\u70b9\u51fb\u201cPropose file change\u201d\u6309\u94ae\uff1b\u9875\u9762\u8df3\u8f6c\u540e\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002

Fig. \u9875\u9762\u7f16\u8f91\u6309\u952e

\u7531\u4e8e\u56fe\u7247\u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u56e0\u6b64\u9700\u8981\u901a\u8fc7\u65b0\u5efa Issue \u6216\u8bc4\u8bba\u7559\u8a00\u6765\u63cf\u8ff0\u56fe\u7247\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5c3d\u5feb\u91cd\u65b0\u7ed8\u5236\u5e76\u66ff\u6362\u56fe\u7247\u3002

"},{"location":"chapter_appendix/contribution/#1422","title":"14.2.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 Pull Request \u5de5\u4f5c\u6d41\u7a0b\uff1a

  1. \u767b\u5f55 GitHub \uff0c\u5c06\u672c\u4ed3\u5e93 Fork \u5230\u4e2a\u4eba\u8d26\u53f7\u4e0b\uff1b
  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\uff1b
  3. \u5728\u672c\u5730\u8fdb\u884c\u5185\u5bb9\u521b\u4f5c\uff0c\u5e76\u901a\u8fc7\u8fd0\u884c\u6d4b\u8bd5\u4ee5\u9a8c\u8bc1\u4ee3\u7801\u7684\u6b63\u786e\u6027\uff1b
  4. \u5c06\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u540e Push \u81f3\u8fdc\u7a0b\u4ed3\u5e93\uff1b
  5. \u5237\u65b0\u4ed3\u5e93\u7f51\u9875\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\uff1b
"},{"location":"chapter_appendix/contribution/#1423-docker","title":"14.2.3. \u00a0 Docker \u90e8\u7f72","text":"

\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 Docker \u6765\u90e8\u7f72\u672c\u9879\u76ee\u3002\u6267\u884c\u4ee5\u4e0b\u811a\u672c\uff0c\u7a0d\u7b49\u7247\u523b\u540e\uff0c\u5373\u53ef\u4f7f\u7528\u6d4f\u89c8\u5668\u6253\u5f00 http://localhost:8000 \u6765\u8bbf\u95ee\u672c\u9879\u76ee\u3002

git clone https://github.com/krahets/hello-algo.git\ncd hello-algo\ndocker-compose up -d\n

\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u5220\u9664\u90e8\u7f72\u3002

docker-compose down\n
"},{"location":"chapter_appendix/installation/","title":"14.1. \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1411-vscode","title":"14.1.1. \u00a0 VSCode","text":"

\u672c\u4e66\u63a8\u8350\u4f7f\u7528\u5f00\u6e90\u8f7b\u91cf\u7684 VSCode \u4f5c\u4e3a\u672c\u5730 IDE \uff0c\u4e0b\u8f7d\u5e76\u5b89\u88c5 VSCode \u3002

"},{"location":"chapter_appendix/installation/#1412-java","title":"14.1.2. \u00a0 Java \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 OpenJDK\uff08\u7248\u672c\u9700\u6ee1\u8db3 > JDK 9\uff09\u3002
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88c5 Extension Pack for Java \u3002
"},{"location":"chapter_appendix/installation/#1413-cc","title":"14.1.3. \u00a0 C/C++ \u73af\u5883","text":"
  1. Windows \u7cfb\u7edf\u9700\u8981\u5b89\u88c5 MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff0cMacOS \u81ea\u5e26 Clang \u65e0\u9700\u5b89\u88c5\u3002
  2. \u5728 VSCode \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/#1414-python","title":"14.1.4. \u00a0 Python \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Miniconda3 \u3002
  2. \u5728 VSCode \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/#1415-go","title":"14.1.5. \u00a0 Go \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 go \u3002
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88c5 Go \u3002
  3. \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/#1416-javascript","title":"14.1.6. \u00a0 JavaScript \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 node.js \u3002
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 javascript \uff0c\u5b89\u88c5 JavaScript (ES6) code snippets \u3002
  3. \uff08\u53ef\u9009\uff09\u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#1417-c","title":"14.1.7. \u00a0 C# \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 .Net 6.0 \uff1b
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 c# \uff0c\u5b89\u88c5 c# \u3002
"},{"location":"chapter_appendix/installation/#1418-swift","title":"14.1.8. \u00a0 Swift \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Swift\uff1b
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88c5 Swift for Visual Studio Code\u3002
"},{"location":"chapter_appendix/installation/#1419-rust","title":"14.1.9. \u00a0 Rust \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Rust\uff1b
  2. \u5728 VSCode \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88c5 rust-analyzer\u3002
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1. \u00a0 \u6570\u7ec4","text":"

\u300c\u6570\u7ec4 Array\u300d\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5c06\u76f8\u540c\u7c7b\u578b\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\u5143\u7d20\u7684\u300c\u7d22\u5f15 Index\u300d\u3002

Fig. \u6570\u7ec4\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

\u6570\u7ec4\u521d\u59cb\u5316\u3002\u901a\u5e38\u6709\u65e0\u521d\u59cb\u503c\u548c\u7ed9\u5b9a\u521d\u59cb\u503c\u4e24\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u53ef\u6839\u636e\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\u3002\u5728\u672a\u7ed9\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u51b5\u4e0b\uff0c\u6570\u7ec4\u7684\u6240\u6709\u5143\u7d20\u901a\u5e38\u4f1a\u88ab\u521d\u59cb\u5316\u4e3a\u9ed8\u8ba4\u503c \\(0\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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.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\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
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.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.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.c
int arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 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.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.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
"},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1. \u00a0 \u6570\u7ec4\u4f18\u70b9","text":"

\u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5143\u7d20\u975e\u5e38\u9ad8\u6548\u3002\u7531\u4e8e\u6570\u7ec4\u5143\u7d20\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u56e0\u6b64\u8ba1\u7b97\u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7ed9\u5b9a\u6570\u7ec4\u9996\u4e2a\u5143\u7d20\u7684\u5730\u5740\u548c\u67d0\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u5f97\u5230\u8be5\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u76f4\u63a5\u8bbf\u95ee\u6b64\u5143\u7d20\u3002

Fig. \u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u8ba1\u7b97

# \u5143\u7d20\u5185\u5b58\u5730\u5740 = \u6570\u7ec4\u5185\u5b58\u5730\u5740 + \u5143\u7d20\u957f\u5ea6 * \u5143\u7d20\u7d22\u5f15\nelementAddr = firtstElementAddr + elementLength * elementIndex\n

\u4e3a\u4ec0\u4e48\u6570\u7ec4\u5143\u7d20\u7684\u7d22\u5f15\u8981\u4ece \\(0\\) \u5f00\u59cb\u7f16\u53f7\u5462\uff1f

\u89c2\u5bdf\u4e0a\u56fe\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

\u7136\u800c\uff0c\u4ece\u5730\u5740\u8ba1\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8d28\u4e0a\u8868\u793a\u7684\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\u7d22\u5f15\u4e3a \\(0\\) \u4e5f\u662f\u5408\u7406\u7684\u3002

\u8bbf\u95ee\u5143\u7d20\u7684\u9ad8\u6548\u6027\u5e26\u6765\u4e86\u8bf8\u591a\u4fbf\u5229\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u968f\u673a\u83b7\u53d6\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u5143\u7d20\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int[] nums) {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
array.cpp
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n// \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = rand() % size;\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
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\nrandom_index = random.randint(0, len(nums) - 1)\n# \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nrandom_num = nums[random_index]\nreturn random_num\n
array.go
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nrandomIndex := rand.Intn(len(nums))\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nrandomNum = nums[randomIndex]\nreturn\n}\n
array.js
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunction randomAccess(nums) {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nconst random_index = Math.floor(Math.random() * nums.length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nconst random_num = nums[random_index];\nreturn random_num;\n}\n
array.ts
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n// \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nconst random_index = Math.floor(Math.random() * nums.length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nconst random_num = nums[random_index];\nreturn random_num;\n}\n
array.c
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n// \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = rand() % size;\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
array.cs
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nint randomAccess(int[] nums)\n{\nRandom random = new();\n// \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nint randomIndex = random.Next(nums.Length);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nint randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
array.swift
/* \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n// \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\nlet randomIndex = nums.indices.randomElement()!\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nlet randomNum = nums[randomIndex]\nreturn randomNum\n}\n
array.zig
// \u968f\u673a\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n// \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\nvar randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n// \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\nvar randomNum = nums[randomIndex];\nreturn randomNum;\n}\n
"},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2. \u00a0 \u6570\u7ec4\u7f3a\u70b9","text":"

\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u7531\u4e8e\u7cfb\u7edf\u65e0\u6cd5\u4fdd\u8bc1\u6570\u7ec4\u4e4b\u540e\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u53ef\u7528\u7684\uff0c\u56e0\u6b64\u6570\u7ec4\u957f\u5ea6\u65e0\u6cd5\u6269\u5c55\u3002\u800c\u82e5\u5e0c\u671b\u6269\u5bb9\u6570\u7ec4\uff0c\u5219\u9700\u65b0\u5efa\u4e00\u4e2a\u6570\u7ec4\uff0c\u7136\u540e\u628a\u539f\u6570\u7ec4\u5143\u7d20\u4f9d\u6b21\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\uff0c\u5728\u6570\u7ec4\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u8fd9\u662f\u975e\u5e38\u8017\u65f6\u7684\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint[] res = new int[nums.length + enlarge];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < nums.length; i++) {\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\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\nint *res = new int[size + enlarge];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\nres[i] = nums[i];\n}\n// \u91ca\u653e\u5185\u5b58\ndelete[] nums;\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\n
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\nres = [0] * (len(nums) + enlarge)\n# \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor i in range(len(nums)):\nres[i] = nums[i]\n# \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res\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\nres := make([]int, len(nums)+enlarge)\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor i, num := range nums {\nres[i] = num\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\u662f\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\nconst 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\nfor (let i = 0; i < nums.length; i++) {\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\u662f\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\nconst 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\nfor (let i = 0; i < nums.length; i++) {\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\nint *res = (int *)malloc(sizeof(int) * (size + enlarge));\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\nres[i] = nums[i];\n}\n// \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\nfor (int i = size; i < size + enlarge; i++) {\nres[i] = 0;\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\n
array.cs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge)\n{\n// \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\nint[] res = new int[nums.Length + enlarge];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < nums.Length; i++)\n{\nres[i] = nums[i];\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn 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\nvar 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\nfor i in nums.indices {\nres[i] = nums[i]\n}\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res\n}\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\nvar res = try mem_allocator.alloc(i32, nums.len + enlarge);\nstd.mem.set(i32, res, 0);\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nstd.mem.copy(i32, res, nums);\n// \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\nreturn res;\n}\n

\u6570\u7ec4\u4e2d\u63d2\u5165\u6216\u5220\u9664\u5143\u7d20\u6548\u7387\u4f4e\u4e0b\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\u5728\u6570\u7ec4\u4e2d\u95f4\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\uff0c\u7531\u4e8e\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\u653e\u4efb\u4f55\u6570\u636e\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4e0d\u5f97\u4e0d\u5c06\u6b64\u7d22\u5f15\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u518d\u628a\u5143\u7d20\u8d4b\u503c\u7ed9\u8be5\u7d22\u5f15\u3002

Fig. \u6570\u7ec4\u63d2\u5165\u5143\u7d20

JavaC++PythonGoJavaScriptTypeScriptCC#Swift 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\nfor (int i = nums.length - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num;\n}\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\nfor (int i = size - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num;\n}\n
array.py
def insert(nums: list[int], num: int, index: int) -> None:\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\nfor i in range(len(nums) - 1, index, -1):\nnums[i] = nums[i - 1]\n# \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num\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\nfor i := len(nums) - 1; i > index; i-- {\nnums[i] = nums[i-1]\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor (let i = nums.length - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor (let i = nums.length - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor (int i = size - 1; i > index; i--) {\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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{\n// \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int i = nums.Length - 1; i > index; i--)\n{\nnums[i] = nums[i - 1];\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[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\nfor i in sequence(first: nums.count - 1, next: { $0 > index + 1 ? $0 - 1 : nil }) {\nnums[i] = nums[i - 1]\n}\n// \u5c06 num \u8d4b\u7ed9 index \u5904\u5143\u7d20\nnums[index] = num\n}\n

\u5220\u9664\u5143\u7d20\u4e5f\u7c7b\u4f3c\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\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\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5220\u9664\u5143\u7d20\u540e\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u53d8\u5f97\u201c\u65e0\u610f\u4e49\u201d\u4e86\uff0c\u6211\u4eec\u65e0\u9700\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

Fig. \u6570\u7ec4\u5220\u9664\u5143\u7d20

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (int i = index; i < nums.length - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.cpp
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (int i = index; i < size - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.py
def remove(nums: list[int], index: int) -> None:\n\"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20\"\"\"\n# \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor i in range(index, len(nums) - 1):\nnums[i] = nums[i + 1]\n
array.go
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor i := index; i < len(nums)-1; i++ {\nnums[i] = nums[i+1]\n}\n}\n
array.js
/* \u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20 */\nfunction remove(nums, index) {\n// \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (let i = index; i < nums.length - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.ts
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (let i = index; i < nums.length - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.c
/* \u5220\u9664\u7d22\u5f15 index \u5904\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\nfor (int i = index; i < size - 1; i++) {\nnums[i] = nums[i + 1];\n}\n}\n
array.cs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20 */\nvoid remove(int[] nums, int index)\n{\n// \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int i = index; i < nums.Length - 1; i++)\n{\nnums[i] = nums[i + 1];\n}\n}\n
array.swift
/* \u5220\u9664\u7d22\u5f15 index \u5904\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\nlet count = nums.count\n// \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor i in sequence(first: index, next: { $0 < count - 1 - 1 ? $0 + 1 : nil }) {\nnums[i] = nums[i + 1]\n}\n}\n
array.zig
// \u5220\u9664\u7d22\u5f15 index \u5904\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\nvar i = index;\nwhile (i < nums.len - 1) : (i += 1) {\nnums[i] = nums[i + 1];\n}\n}\n

\u603b\u7ed3\u6765\u770b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u70b9\uff1a

  • \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\u6211\u4eec\u4e0d\u5173\u5fc3\u7684\uff0c\u4f46\u8fd9\u6837\u505a\u540c\u65f6\u4e5f\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u7684\u6d6a\u8d39\u3002
"},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3. \u00a0 \u6570\u7ec4\u5e38\u7528\u64cd\u4f5c","text":"

\u6570\u7ec4\u904d\u5386\u3002\u4ee5\u4e0b\u4ecb\u7ecd\u4e24\u79cd\u5e38\u7528\u7684\u904d\u5386\u65b9\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < nums.length; i++) {\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (int num : nums) {\ncount++;\n}\n}\n
array.cpp
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\ncount++;\n}\n}\n
array.py
def traverse(nums: list[int]) -> None:\n\"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\ncount = 0\n# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor i in range(len(nums)):\ncount += 1\n# \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor num in nums:\ncount += 1\n
array.go
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\ncount := 0\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor i := 0; i < len(nums); i++ {\ncount++\n}\ncount = 0\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor range nums {\ncount++\n}\n}\n
array.js
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\nlet count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (let num of nums) {\ncount += 1;\n}\n}\n
array.ts
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\nlet count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (let num of nums) {\ncount += 1;\n}\n}\n
array.c
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < size; i++) {\ncount++;\n}\n}\n
array.cs
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums)\n{\nint count = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor (int i = 0; i < nums.Length; i++)\n{\ncount++;\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nforeach (int num in nums)\n{\ncount++;\n}\n}\n
array.swift
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\nvar count = 0\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nfor _ in nums.indices {\ncount += 1\n}\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor _ in nums {\ncount += 1\n}\n}\n
array.zig
// \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\nvar count: i32 = 0;\n// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\nvar i: i32 = 0;\nwhile (i < nums.len) : (i += 1) {\ncount += 1;\n}\ncount = 0;\n// \u76f4\u63a5\u904d\u5386\u6570\u7ec4\nfor (nums) |_| {\ncount += 1;\n}\n}\n

\u6570\u7ec4\u67e5\u627e\u3002\u901a\u8fc7\u904d\u5386\u6570\u7ec4\uff0c\u67e5\u627e\u6570\u7ec4\u5185\u7684\u6307\u5b9a\u5143\u7d20\uff0c\u5e76\u8f93\u51fa\u5bf9\u5e94\u7d22\u5f15\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array.java
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\nfor (int i = 0; i < nums.length; i++) {\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.cpp
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\nfor (int i = 0; i < size; i++) {\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.py
def find(nums: list[int], target: int) -> int:\n\"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\nfor i in range(len(nums)):\nif nums[i] == target:\nreturn i\nreturn -1\n
array.go
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\nindex = -1\nfor i := 0; i < len(nums); i++ {\nif nums[i] == target {\nindex = i\nbreak\n}\n}\nreturn\n}\n
array.js
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\nfor (let i = 0; i < nums.length; i++) {\nif (nums[i] == target) return i;\n}\nreturn -1;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\nfor (let i = 0; i < nums.length; i++) {\nif (nums[i] === target) {\nreturn i;\n}\n}\nreturn -1;\n}\n
array.c
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\nfor (int i = 0; i < size; i++) {\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target)\n{\nfor (int i = 0; i < nums.Length; i++)\n{\nif (nums[i] == target)\nreturn i;\n}\nreturn -1;\n}\n
array.swift
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\nfor i in nums.indices {\nif nums[i] == target {\nreturn i\n}\n}\nreturn -1\n}\n
array.zig
// \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\nfor (nums) |num, i| {\nif (num == target) return @intCast(i32, i);\n}\nreturn -1;\n}\n
"},{"location":"chapter_array_and_linkedlist/array/#414","title":"4.1.4. \u00a0 \u6570\u7ec4\u5178\u578b\u5e94\u7528","text":"

\u968f\u673a\u8bbf\u95ee\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\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\u6837\u672c\u7684\u968f\u673a\u62bd\u53d6\u3002

\u4e8c\u5206\u67e5\u627e\u3002\u4f8b\u5982\u524d\u6587\u67e5\u5b57\u5178\u7684\u4f8b\u5b50\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u5178\u4e2d\u7684\u6240\u6709\u5b57\u6309\u7167\u62fc\u97f3\u987a\u5e8f\u5b58\u50a8\u5728\u6570\u7ec4\u4e2d\uff0c\u7136\u540e\u4f7f\u7528\u4e0e\u65e5\u5e38\u67e5\u7eb8\u8d28\u5b57\u5178\u76f8\u540c\u7684\u201c\u7ffb\u5f00\u4e2d\u95f4\uff0c\u6392\u9664\u4e00\u534a\u201d\u7684\u65b9\u5f0f\uff0c\u6765\u5b9e\u73b0\u4e00\u4e2a\u67e5\u7535\u5b50\u5b57\u5178\u7684\u7b97\u6cd5\u3002

\u6df1\u5ea6\u5b66\u4e60\u3002\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

"},{"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\u6392\u9664\u5df2\u88ab\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u7a7a\u95f2\u5185\u5b58\u7a7a\u95f4\u901a\u5e38\u6563\u843d\u5728\u5185\u5b58\u5404\u5904\u3002\u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u5b58\u50a8\u6570\u7ec4\u7684\u5185\u5b58\u7a7a\u95f4\u5fc5\u987b\u662f\u8fde\u7eed\u7684\uff0c\u800c\u5f53\u6211\u4eec\u9700\u8981\u7533\u8bf7\u4e00\u4e2a\u975e\u5e38\u5927\u7684\u6570\u7ec4\u65f6\uff0c\u7a7a\u95f2\u5185\u5b58\u4e2d\u53ef\u80fd\u6ca1\u6709\u8fd9\u4e48\u5927\u7684\u8fde\u7eed\u7a7a\u95f4\u3002\u4e0e\u6570\u7ec4\u76f8\u6bd4\uff0c\u94fe\u8868\u66f4\u5177\u7075\u6d3b\u6027\uff0c\u5b83\u53ef\u4ee5\u88ab\u5b58\u50a8\u5728\u975e\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002

\u300c\u94fe\u8868 Linked List\u300d\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u5404\u4e2a\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u8fde\u63a5\uff0c\u4ece\u5f53\u524d\u8282\u70b9\u901a\u8fc7\u6307\u9488\u53ef\u4ee5\u8bbf\u95ee\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002\u7531\u4e8e\u6307\u9488\u8bb0\u5f55\u4e86\u4e0b\u4e2a\u8282\u70b9\u7684\u5185\u5b58\u5730\u5740\uff0c\u56e0\u6b64\u65e0\u9700\u4fdd\u8bc1\u5185\u5b58\u5730\u5740\u7684\u8fde\u7eed\u6027\uff0c\u4ece\u800c\u53ef\u4ee5\u5c06\u5404\u4e2a\u8282\u70b9\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\u3002

\u94fe\u8868\u300c\u8282\u70b9 Node\u300d\u5305\u542b\u4e24\u9879\u6570\u636e\uff0c\u4e00\u662f\u8282\u70b9\u300c\u503c Value\u300d\uff0c\u4e8c\u662f\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u300c\u6307\u9488 Pointer\u300d\uff0c\u6216\u79f0\u300c\u5f15\u7528 Reference\u300d\u3002

Fig. \u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nint val;        // \u8282\u70b9\u503c\nListNode next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;         // \u8282\u70b9\u503c\nListNode *next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) : val(x), next(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
class ListNode:\n\"\"\"\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                  # \u8282\u70b9\u503c\nself.next: Optional[ListNode] = None # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype ListNode struct {\nVal  int       // \u8282\u70b9\u503c\nNext *ListNode // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n// NewListNode \u6784\u9020\u51fd\u6570\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u94fe\u8868\nfunc NewListNode(val int) *ListNode {\nreturn &ListNode{\nVal:  val,\nNext: nil,\n}\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval;\nnext;\nconstructor(val, next) {\nthis.val = (val === undefined ? 0 : val);       // \u8282\u70b9\u503c\nthis.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval: number;\nnext: ListNode | null;\nconstructor(val?: number, next?: ListNode | null) {\nthis.val = val === undefined ? 0 : val;        // \u8282\u70b9\u503c\nthis.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;               // \u8282\u70b9\u503c\nstruct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n};\ntypedef struct ListNode ListNode;\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\nListNode *node, *next;\nnode = (ListNode *) malloc(sizeof(ListNode));\nnode->val = val;\nnode->next = NULL;\nreturn node;\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode\n{\nint val;         // \u8282\u70b9\u503c\nListNode next;   // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\nListNode(int x) => val = x;  //\u6784\u9020\u51fd\u6570\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nvar val: Int // \u8282\u70b9\u503c\nvar next: ListNode? // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\ninit(x: Int) { // \u6784\u9020\u51fd\u6570\nval = x\n}\n}\n
// \u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nval: T = 0, // \u8282\u70b9\u503c\nnext: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n// \u6784\u9020\u51fd\u6570\npub fn init(self: *Self, x: i32) void {\nself.val = x;\nself.next = null;\n}\n};\n}\n

\u5c3e\u8282\u70b9\u6307\u5411\u4ec0\u4e48\uff1f

\u6211\u4eec\u5c06\u94fe\u8868\u7684\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u79f0\u4e3a\u300c\u5c3e\u8282\u70b9\u300d\uff0c\u5176\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5728 Java, C++, Python \u4e2d\u5206\u522b\u8bb0\u4e3a \\(\\text{null}\\) , \\(\\text{nullptr}\\) , \\(\\text{None}\\) \u3002\u5728\u4e0d\u5f15\u8d77\u6b67\u4e49\u7684\u524d\u63d0\u4e0b\uff0c\u672c\u4e66\u90fd\u4f7f\u7528 \\(\\text{null}\\) \u6765\u8868\u793a\u7a7a\u3002

\u5982\u4f55\u79f0\u547c\u94fe\u8868\uff1f

\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6570\u7ec4\u6574\u4f53\u5c31\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u4f8b\u5982\u6570\u7ec4 nums \uff0c\u5305\u542b\u5404\u4e2a\u5143\u7d20 nums[0] , nums[1] \u7b49\u7b49\u3002\u800c\u94fe\u8868\u662f\u7531\u591a\u4e2a\u8282\u70b9\u5bf9\u8c61\u7ec4\u6210\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u5934\u8282\u70b9\u5f53\u4f5c\u94fe\u8868\u7684\u4ee3\u79f0\uff0c\u4f8b\u5982\u5934\u8282\u70b9 head \u548c\u94fe\u8868 head \u5b9e\u9645\u4e0a\u662f\u540c\u4e49\u7684\u3002

\u94fe\u8868\u521d\u59cb\u5316\u65b9\u6cd5\u3002\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\u5f15\u7528\u6307\u5411\u5173\u7cfb\u3002\u5b8c\u6210\u540e\uff0c\u5373\u53ef\u4ee5\u4ece\u94fe\u8868\u7684\u5934\u8282\u70b9\uff08\u5373\u9996\u4e2a\u8282\u70b9\uff09\u51fa\u53d1\uff0c\u901a\u8fc7\u6307\u9488 next \u4f9d\u6b21\u8bbf\u95ee\u6240\u6709\u8282\u70b9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\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\u5f15\u7528\u6307\u5411\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 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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\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\u5f15\u7528\u6307\u5411\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1. \u00a0 \u94fe\u8868\u4f18\u70b9","text":"

\u94fe\u8868\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u7684\u64cd\u4f5c\u6548\u7387\u9ad8\u3002\u4f8b\u5982\uff0c\u5982\u679c\u6211\u4eec\u60f3\u5728\u94fe\u8868\u4e2d\u95f4\u7684\u4e24\u4e2a\u8282\u70b9 A , B \u4e4b\u95f4\u63d2\u5165\u4e00\u4e2a\u65b0\u8282\u70b9 P \uff0c\u6211\u4eec\u53ea\u9700\u8981\u6539\u53d8\u4e24\u4e2a\u8282\u70b9\u6307\u9488\u5373\u53ef\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1b\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u64cd\u4f5c\u6548\u7387\u8981\u4f4e\u5f97\u591a\u3002

Fig. \u94fe\u8868\u63d2\u5165\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\nListNode n1 = n0.next;\nP.next = n1;\nn0.next = P;\n}\n
linked_list.cpp
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\nListNode *n1 = n0->next;\nP->next = n1;\nn0->next = P;\n}\n
linked_list.py
def insert(n0: ListNode, P: ListNode) -> None:\n\"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\nn1 = n0.next\nP.next = n1\nn0.next = P\n
linked_list.go
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\nn1 := n0.Next\nP.Next = n1\nn0.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) {\nconst n1 = n0.next;\nP.next = n1;\nn0.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 {\nconst n1 = n0.next;\nP.next = n1;\nn0.next = 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) {\nListNode *n1 = n0->next;\nP->next = n1;\nn0->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{\nListNode? n1 = n0.next;\nP.next = n1;\nn0.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) {\nlet n1 = n0.next\nP.next = n1\nn0.next = P\n}\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 {\nvar n1 = n0.?.next;\nP.?.next = n1;\nn0.?.next = P;\n}\n

\u5728\u94fe\u8868\u4e2d\u5220\u9664\u8282\u70b9\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u53d8\u4e00\u4e2a\u8282\u70b9\u7684\u6307\u9488\u5373\u53ef\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5c3d\u7ba1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\uff0c\u8282\u70b9 P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5b9e\u9645\u4e0a P \u5df2\u7ecf\u4e0d\u518d\u5c5e\u4e8e\u6b64\u94fe\u8868\uff0c\u56e0\u4e3a\u904d\u5386\u6b64\u94fe\u8868\u65f6\u65e0\u6cd5\u8bbf\u95ee\u5230 P \u3002

Fig. \u94fe\u8868\u5220\u9664\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\nif (n0.next == null)\nreturn;\n// n0 -> P -> n1\nListNode P = n0.next;\nListNode n1 = P.next;\nn0.next = n1;\n}\n
linked_list.cpp
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\nif (n0->next == nullptr)\nreturn;\n// n0 -> P -> n1\nListNode *P = n0->next;\nListNode *n1 = P->next;\nn0->next = n1;\n// \u91ca\u653e\u5185\u5b58\ndelete P;\n}\n
linked_list.py
def remove(n0: ListNode) -> None:\n\"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\nif not n0.next:\nreturn\n# n0 -> P -> n1\nP = n0.next\nn1 = P.next\nn0.next = n1\n
linked_list.go
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeNode(n0 *ListNode) {\nif n0.Next == nil {\nreturn\n}\n// n0 -> P -> n1\nP := n0.Next\nn1 := P.Next\nn0.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) {\nif (!n0.next) return;\n// n0 -> P -> n1\nconst P = n0.next;\nconst n1 = P.next;\nn0.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 {\nif (!n0.next) {\nreturn;\n}\n// n0 -> P -> n1\nconst P = n0.next;\nconst n1 = P.next;\nn0.next = n1;\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 removeNode(ListNode *n0) {\nif (!n0->next)\nreturn;\n// n0 -> P -> n1\nListNode *P = n0->next;\nListNode *n1 = P->next;\nn0->next = n1;\n// \u91ca\u653e\u5185\u5b58\nfree(P);\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{\nif (n0.next == null)\nreturn;\n// n0 -> P -> n1\nListNode P = n0.next;\nListNode? n1 = P.next;\nn0.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) {\nif n0.next == nil {\nreturn\n}\n// n0 -> P -> n1\nlet P = n0.next\nlet n1 = P?.next\nn0.next = n1\nP?.next = nil\n}\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 {\nif (n0.?.next == null) return;\n// n0 -> P -> n1\nvar P = n0.?.next;\nvar n1 = P.?.next;\nn0.?.next = n1;\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#422","title":"4.2.2. \u00a0 \u94fe\u8868\u7f3a\u70b9","text":"

\u94fe\u8868\u8bbf\u95ee\u8282\u70b9\u6548\u7387\u8f83\u4f4e\u3002\u5982\u4e0a\u8282\u6240\u8ff0\uff0c\u6570\u7ec4\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u4e0b\u8bbf\u95ee\u4efb\u610f\u5143\u7d20\u3002\u7136\u800c\uff0c\u94fe\u8868\u65e0\u6cd5\u76f4\u63a5\u8bbf\u95ee\u4efb\u610f\u8282\u70b9\uff0c\u8fd9\u662f\u56e0\u4e3a\u7cfb\u7edf\u9700\u8981\u4ece\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u9010\u4e2a\u5411\u540e\u904d\u5386\u76f4\u81f3\u627e\u5230\u76ee\u6807\u8282\u70b9\u3002\u4f8b\u5982\uff0c\u82e5\u8981\u8bbf\u95ee\u94fe\u8868\u7d22\u5f15\u4e3a index\uff08\u5373\u7b2c index + 1 \u4e2a\uff09\u7684\u8282\u70b9\uff0c\u5219\u9700\u8981\u5411\u540e\u904d\u5386 index \u8f6e\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\nfor (int i = 0; i < index; i++) {\nif (head == null)\nreturn null;\nhead = head.next;\n}\nreturn head;\n}\n
linked_list.cpp
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\nfor (int i = 0; i < index; i++) {\nif (head == nullptr)\nreturn nullptr;\nhead = head->next;\n}\nreturn head;\n}\n
linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n\"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\nfor _ in range(index):\nif not head:\nreturn None\nhead = head.next\nreturn head\n
linked_list.go
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\nfor i := 0; i < index; i++ {\nif head == nil {\nreturn nil\n}\nhead = head.Next\n}\nreturn head\n}\n
linked_list.js
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\nfor (let i = 0; i < index; i++) {\nif (!head) {\nreturn null;\n}\nhead = head.next;\n}\nreturn 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 {\nfor (let i = 0; i < index; i++) {\nif (!head) {\nreturn null;\n}\nhead = head.next;\n}\nreturn head;\n}\n
linked_list.c
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\nwhile (head && head->next && index) {\nhead = head->next;\nindex--;\n}\nreturn 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{\nfor (int i = 0; i < index; i++)\n{\nif (head == null)\nreturn null;\nhead = head.next;\n}\nreturn 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? {\nvar head: ListNode? = head\nfor _ in 0 ..< index {\nif head == nil {\nreturn nil\n}\nhead = head?.next\n}\nreturn head\n}\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) {\nvar head = node;\nvar i: i32 = 0;\nwhile (i < index) : (i += 1) {\nhead = head.?.next;\nif (head == null) return null;\n}\nreturn head;\n}\n

\u94fe\u8868\u7684\u5185\u5b58\u5360\u7528\u8f83\u5927\u3002\u94fe\u8868\u4ee5\u8282\u70b9\u4e3a\u5355\u4f4d\uff0c\u6bcf\u4e2a\u8282\u70b9\u9664\u4e86\u4fdd\u5b58\u503c\u4e4b\u5916\uff0c\u8fd8\u9700\u989d\u5916\u4fdd\u5b58\u6307\u9488\uff08\u5f15\u7528\uff09\u3002\u8fd9\u610f\u5473\u7740\u5728\u76f8\u540c\u6570\u636e\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u94fe\u8868\u6bd4\u6570\u7ec4\u9700\u8981\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002

"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3. \u00a0 \u94fe\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u904d\u5386\u94fe\u8868\u67e5\u627e\u3002\u904d\u5386\u94fe\u8868\uff0c\u67e5\u627e\u94fe\u8868\u5185\u503c\u4e3a target \u7684\u8282\u70b9\uff0c\u8f93\u51fa\u8282\u70b9\u5728\u94fe\u8868\u4e2d\u7684\u7d22\u5f15\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linked_list.java
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\nint index = 0;\nwhile (head != null) {\nif (head.val == target)\nreturn index;\nhead = head.next;\nindex++;\n}\nreturn -1;\n}\n
linked_list.cpp
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\nint index = 0;\nwhile (head != nullptr) {\nif (head->val == target)\nreturn index;\nhead = head->next;\nindex++;\n}\nreturn -1;\n}\n
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\"\"\"\nindex = 0\nwhile head:\nif head.val == target:\nreturn index\nhead = head.next\nindex += 1\nreturn -1\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 {\nindex := 0\nfor head != nil {\nif head.Val == target {\nreturn index\n}\nhead = head.Next\nindex++\n}\nreturn -1\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\nlet index = 0;\nwhile (head !== null) {\nif (head.val === target) {\nreturn index;\n}\nhead = head.next;\nindex += 1;\n}\nreturn -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 {\nlet index = 0;\nwhile (head !== null) {\nif (head.val === target) {\nreturn index;\n}\nhead = head.next;\nindex += 1;\n}\nreturn -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) {\nint index = 0;\nwhile (head) {\nif (head->val == target)\nreturn index;\nhead = head->next;\nindex++;\n}\nreturn -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{\nint index = 0;\nwhile (head != null)\n{\nif (head.val == target)\nreturn index;\nhead = head.next;\nindex++;\n}\nreturn -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 {\nvar head: ListNode? = head\nvar index = 0\nwhile head != nil {\nif head?.val == target {\nreturn index\n}\nhead = head?.next\nindex += 1\n}\nreturn -1\n}\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 {\nvar head = node;\nvar index: i32 = 0;\nwhile (head != null) {\nif (head.?.val == target) return index;\nhead = head.?.next;\nindex += 1;\n}\nreturn -1;\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4. \u00a0 \u5e38\u89c1\u94fe\u8868\u7c7b\u578b","text":"

\u5355\u5411\u94fe\u8868\u3002\u5373\u4e0a\u8ff0\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\u6307\u9488\uff08\u5f15\u7528\uff09\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\u6210\u4e3a\u5c3e\u8282\u70b9\uff0c\u5c3e\u8282\u70b9\u6307\u5411 \\(\\text{null}\\) \u3002

\u73af\u5f62\u94fe\u8868\u3002\u5982\u679c\u6211\u4eec\u4ee4\u5355\u5411\u94fe\u8868\u7684\u5c3e\u8282\u70b9\u6307\u5411\u5934\u8282\u70b9\uff08\u5373\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\u3002\u4e0e\u5355\u5411\u94fe\u8868\u76f8\u6bd4\uff0c\u53cc\u5411\u94fe\u8868\u8bb0\u5f55\u4e86\u4e24\u4e2a\u65b9\u5411\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\u3002\u53cc\u5411\u94fe\u8868\u7684\u8282\u70b9\u5b9a\u4e49\u540c\u65f6\u5305\u542b\u6307\u5411\u540e\u7ee7\u8282\u70b9\uff08\u4e0b\u4e00\u8282\u70b9\uff09\u548c\u524d\u9a71\u8282\u70b9\uff08\u4e0a\u4e00\u8282\u70b9\uff09\u7684\u6307\u9488\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nint val;        // \u8282\u70b9\u503c\nListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;         // \u8282\u70b9\u503c\nListNode *next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode *prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
class ListNode:\n\"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                   # \u8282\u70b9\u503c\nself.next: Optional[ListNode] = None  # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nself.prev: Optional[ListNode] = None  # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype DoublyListNode struct {\nVal  int             // \u8282\u70b9\u503c\nNext *DoublyListNode // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nPrev *DoublyListNode // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\nreturn &DoublyListNode{\nVal:  val,\nNext: nil,\nPrev: nil,\n}\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval;\nnext;\nprev;\nconstructor(val, next) {\nthis.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\nthis.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nthis.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nval: number;\nnext: ListNode | null;\nprev: ListNode | null;\nconstructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\nthis.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\nthis.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nthis.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n}\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\nint val;               // \u8282\u70b9\u503c\nstruct ListNode *next; // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nstruct ListNode *prev; // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n};\ntypedef struct ListNode ListNode;\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\nListNode *node, *next;\nnode = (ListNode *) malloc(sizeof(ListNode));\nnode->val = val;\nnode->next = NULL;\nnode->prev = NULL;\nreturn node;\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nint val;        // \u8282\u70b9\u503c\nListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nListNode(int x) => val = x;  // \u6784\u9020\u51fd\u6570\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\nvar val: Int // \u8282\u70b9\u503c\nvar next: ListNode? // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nvar prev: ListNode? // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\ninit(x: Int) { // \u6784\u9020\u51fd\u6570\nval = x\n}\n}\n
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nval: T = 0, // \u8282\u70b9\u503c\nnext: ?*Self = null, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\nprev: ?*Self = null, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\n// \u6784\u9020\u51fd\u6570\npub fn init(self: *Self, x: i32) void {\nself.val = x;\nself.next = null;\nself.prev = null;\n}\n};\n}\n

Fig. \u5e38\u89c1\u94fe\u8868\u79cd\u7c7b

"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3. \u00a0 \u5217\u8868","text":"

\u6570\u7ec4\u957f\u5ea6\u4e0d\u53ef\u53d8\u5bfc\u81f4\u5b9e\u7528\u6027\u964d\u4f4e\u3002\u5728\u8bb8\u591a\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u4e8b\u5148\u65e0\u6cd5\u786e\u5b9a\u9700\u8981\u5b58\u50a8\u591a\u5c11\u6570\u636e\uff0c\u8fd9\u4f7f\u6570\u7ec4\u957f\u5ea6\u7684\u9009\u62e9\u53d8\u5f97\u56f0\u96be\u3002\u82e5\u957f\u5ea6\u8fc7\u5c0f\uff0c\u9700\u8981\u5728\u6301\u7eed\u6dfb\u52a0\u6570\u636e\u65f6\u9891\u7e41\u6269\u5bb9\u6570\u7ec4\uff1b\u82e5\u957f\u5ea6\u8fc7\u5927\uff0c\u5219\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u7684\u6d6a\u8d39\u3002

\u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u51fa\u73b0\u4e86\u4e00\u79cd\u88ab\u79f0\u4e3a\u300c\u52a8\u6001\u6570\u7ec4 Dynamic Array\u300d\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5373\u957f\u5ea6\u53ef\u53d8\u7684\u6570\u7ec4\uff0c\u4e5f\u5e38\u88ab\u79f0\u4e3a\u300c\u5217\u8868 List\u300d\u3002\u5217\u8868\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\uff0c\u7ee7\u627f\u4e86\u6570\u7ec4\u7684\u4f18\u70b9\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u52a8\u6001\u6269\u5bb9\u3002\u5728\u5217\u8868\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u7531\u6dfb\u52a0\u5143\u7d20\uff0c\u800c\u65e0\u9700\u62c5\u5fc3\u8d85\u8fc7\u5bb9\u91cf\u9650\u5236\u3002

"},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1. \u00a0 \u5217\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u521d\u59cb\u5316\u5217\u8868\u3002\u901a\u5e38\u6211\u4eec\u4f1a\u4f7f\u7528\u201c\u65e0\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u7684\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<Integer> list1 = 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> list = new ArrayList<>(Arrays.asList(numbers));\n
list.cpp
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 list\n// \u65e0\u521d\u59cb\u503c\nvector<int> list1;\n// \u6709\u521d\u59cb\u503c\nvector<int> list = { 1, 3, 2, 5, 4 };\n
list.py
# \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nlist1: List[int] = []\n# \u6709\u521d\u59cb\u503c\nlist: List[int] = [1, 3, 2, 5, 4]\n
list_test.go
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlist1 := []int\n// \u6709\u521d\u59cb\u503c\nlist := []int{1, 3, 2, 5, 4}\n
list.js
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst list1 = [];\n// \u6709\u521d\u59cb\u503c\nconst list = [1, 3, 2, 5, 4];\n
list.ts
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst list1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst list: number[] = [1, 3, 2, 5, 4];\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> list1 = new ();\n// \u6709\u521d\u59cb\u503c\nint[] numbers = new int[] { 1, 3, 2, 5, 4 };\nList<int> list = numbers.ToList();\n
list.swift
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet list1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar list = [1, 3, 2, 5, 4]\n
list.zig
// \u521d\u59cb\u5316\u5217\u8868\nvar list = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer list.deinit();\ntry list.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n

\u8bbf\u95ee\u4e0e\u66f4\u65b0\u5143\u7d20\u3002\u7531\u4e8e\u5217\u8868\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = list.get(1);  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist.set(1, 0);  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.cpp
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.py
# \u8bbf\u95ee\u5143\u7d20\nnum: int = list[1]  # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nlist[1] = 0    # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list_test.go
/* \u8bbf\u95ee\u5143\u7d20 */\nnum := list[1]  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0     // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.js
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.ts
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num: number = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[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.cs
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = list[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.swift
/* \u8bbf\u95ee\u5143\u7d20 */\nlet num = list[1] // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nlist[1] = 0 // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.zig
// \u8bbf\u95ee\u5143\u7d20\nvar num = list.items[1]; // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n// \u66f4\u65b0\u5143\u7d20\nlist.items[1] = 0; // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0  \n

\u5728\u5217\u8868\u4e2d\u6dfb\u52a0\u3001\u63d2\u5165\u3001\u5220\u9664\u5143\u7d20\u3002\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u6e05\u7a7a\u5217\u8868 */\nlist.clear();\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.add(1);\nlist.add(3);\nlist.add(2);\nlist.add(5);\nlist.add(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.cpp
/* \u6e05\u7a7a\u5217\u8868 */\nlist.clear();\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.push_back(1);\nlist.push_back(3);\nlist.push_back(2);\nlist.push_back(5);\nlist.push_back(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.insert(list.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist.erase(list.begin() + 3);      // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.py
# \u6e05\u7a7a\u5217\u8868\nlist.clear()\n# \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nlist.append(1)\nlist.append(3)\nlist.append(2)\nlist.append(5)\nlist.append(4)\n# \u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nlist.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n# \u5220\u9664\u5143\u7d20\nlist.pop(3)        # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list_test.go
/* \u6e05\u7a7a\u5217\u8868 */\nlist = nil\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist = append(list, 1)\nlist = append(list, 3)\nlist = append(list, 2)\nlist = append(list, 5)\nlist = append(list, 4)\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist = append(list[:3], append([]int{6}, list[3:]...)...) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist = append(list[:3], list[4:]...) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.js
/* \u6e05\u7a7a\u5217\u8868 */\nlist.length = 0;\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.push(1);\nlist.push(3);\nlist.push(2);\nlist.push(5);\nlist.push(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.splice(3, 0, 6);\n/* \u5220\u9664\u5143\u7d20 */\nlist.splice(3, 1);\n
list.ts
/* \u6e05\u7a7a\u5217\u8868 */\nlist.length = 0;\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.push(1);\nlist.push(3);\nlist.push(2);\nlist.push(5);\nlist.push(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.splice(3, 0, 6);\n/* \u5220\u9664\u5143\u7d20 */\nlist.splice(3, 1);\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u6e05\u7a7a\u5217\u8868 */\nlist.Clear();\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.Add(1);\nlist.Add(3);\nlist.Add(2);\nlist.Add(5);\nlist.Add(4);\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.Insert(3, 6);\n/* \u5220\u9664\u5143\u7d20 */\nlist.RemoveAt(3);\n
list.swift
/* \u6e05\u7a7a\u5217\u8868 */\nlist.removeAll()\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nlist.append(1)\nlist.append(3)\nlist.append(2)\nlist.append(5)\nlist.append(4)\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nlist.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n/* \u5220\u9664\u5143\u7d20 */\nlist.remove(at: 3) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.zig
// \u6e05\u7a7a\u5217\u8868\nlist.clearRetainingCapacity();\n// \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\ntry list.append(1);\ntry list.append(3);\ntry list.append(2);\ntry list.append(5);\ntry list.append(4);\n// \u4e2d\u95f4\u63d2\u5165\u5143\u7d20\ntry list.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n// \u5220\u9664\u5143\u7d20\n_ = list.orderedRemove(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n

\u904d\u5386\u5217\u8868\u3002\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < list.size(); i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int n : list) {\ncount++;\n}\n
list.cpp
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < list.size(); i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int n : list) {\ncount++;\n}\n
list.py
# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount: int = 0\nfor i in range(len(list)):\ncount += 1\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount: int = 0\nfor n in list:\ncount += 1\n
list_test.go
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\ncount := 0\nfor i := 0; i < len(list); i++ {\ncount++\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor range list {\ncount++\n}\n
list.js
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < list.length; i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const n of list) {\ncount++;\n}\n
list.ts
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < list.length; i++) {\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const n of list) {\ncount++;\n}\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < list.Count(); i++)\n{\ncount++;\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nforeach (int n in list)\n{\ncount++;\n}\n
list.swift
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor _ in list.indices {\ncount += 1\n}\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor _ in list {\ncount += 1\n}\n
list.zig
// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < list.items.len) : (i += 1) {\ncount += 1;\n}\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0;\nfor (list.items) |_| {\ncount += 1;\n}\n

\u62fc\u63a5\u4e24\u4e2a\u5217\u8868\u3002\u7ed9\u5b9a\u4e00\u4e2a\u65b0\u5217\u8868 list1 \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8be5\u5217\u8868\u62fc\u63a5\u5230\u539f\u5217\u8868\u7684\u5c3e\u90e8\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<Integer> list1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nlist.addAll(list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.cpp
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nvector<int> list1 = { 6, 8, 7, 10, 9 };\n// \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\nlist.insert(list.end(), list1.begin(), list1.end());\n
list.py
# \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nlist1: List[int] = [6, 8, 7, 10, 9]\nlist += list1  # \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list_test.go
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlist1 := []int{6, 8, 7, 10, 9}\nlist = append(list, list1...)  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.js
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst list1 = [6, 8, 7, 10, 9];\nlist.push(...list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.ts
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst list1: number[] = [6, 8, 7, 10, 9];\nlist.push(...list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.cs
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> list1 = new() { 6, 8, 7, 10, 9 };\nlist.AddRange(list1);  // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.swift
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet list1 = [6, 8, 7, 10, 9]\nlist.append(contentsOf: list1) // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n
list.zig
// \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nvar list1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer list1.deinit();\ntry list1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry list.insertSlice(list.items.len, list1.items); // \u5c06\u5217\u8868 list1 \u62fc\u63a5\u5230 list \u4e4b\u540e\n

\u6392\u5e8f\u5217\u8868\u3002\u6392\u5e8f\u4e5f\u662f\u5e38\u7528\u7684\u65b9\u6cd5\u4e4b\u4e00\u3002\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\u5bdf\u7684\u300c\u4e8c\u5206\u67e5\u627e\u300d\u548c\u300c\u53cc\u6307\u9488\u300d\u7b97\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig list.java
/* \u6392\u5e8f\u5217\u8868 */\nCollections.sort(list);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.cpp
/* \u6392\u5e8f\u5217\u8868 */\nsort(list.begin(), list.end());  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.py
# \u6392\u5e8f\u5217\u8868\nlist.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(list)  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.js
/* \u6392\u5e8f\u5217\u8868 */  list.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 */\nlist.sort((a, b) => a - b);  // \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.cs
/* \u6392\u5e8f\u5217\u8868 */\nlist.Sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.swift
/* \u6392\u5e8f\u5217\u8868 */\nlist.sort() // \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, list.items, {}, comptime std.sort.asc(i32));\n
"},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2. \u00a0 \u5217\u8868\u5b9e\u73b0 *","text":"

\u4e3a\u4e86\u5e2e\u52a9\u52a0\u6df1\u5bf9\u5217\u8868\u7684\u7406\u89e3\uff0c\u6211\u4eec\u5728\u6b64\u63d0\u4f9b\u4e00\u4e2a\u7b80\u6613\u7248\u5217\u8868\u5b9e\u73b0\u3002\u9700\u8981\u5173\u6ce8\u4e09\u4e2a\u6838\u5fc3\u70b9\uff1a

  • \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\u63d2\u5165\u5143\u7d20\u65f6\u53ef\u80fd\u8d85\u51fa\u5217\u8868\u5bb9\u91cf\uff0c\u6b64\u65f6\u9700\u8981\u6269\u5bb9\u5217\u8868\u3002\u6269\u5bb9\u65b9\u6cd5\u662f\u6839\u636e\u6269\u5bb9\u500d\u6570\u521b\u5efa\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u5e76\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

\u672c\u793a\u4f8b\u65e8\u5728\u5e2e\u52a9\u8bfb\u8005\u76f4\u89c2\u7406\u89e3\u5217\u8868\u7684\u5de5\u4f5c\u673a\u5236\u3002\u5b9e\u9645\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u5217\u8868\u5b9e\u73b0\u66f4\u52a0\u6807\u51c6\u548c\u590d\u6742\uff0c\u5404\u4e2a\u53c2\u6570\u7684\u8bbe\u5b9a\u4e5f\u975e\u5e38\u6709\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_list.java
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate int[] nums; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate int capacity = 10; // \u5217\u8868\u5bb9\u91cf\nprivate int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\npublic MyList() {\nnums = new int[capacity];\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\npublic int size() {\nreturn size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic int capacity() {\nreturn capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\npublic int get(int index) {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic void set(int index, int num) {\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\nnums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\npublic void add(int num) {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size == capacity())\nextendCapacity();\nnums[size] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nsize++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\npublic void insert(int index, int num) {\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size == capacity())\nextendCapacity();\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int j = size - 1; j >= index; j--) {\nnums[j + 1] = nums[j];\n}\nnums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nsize++;\n}\n/* \u5220\u9664\u5143\u7d20 */\npublic int remove(int index) {\nif (index < 0 || index >= size)\nthrow new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\nint num = nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int j = index; j < size - 1; j++) {\nnums[j] = nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nsize--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\npublic void extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nnums = Arrays.copyOf(nums, capacity() * extendRatio);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\ncapacity = nums.length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\npublic int[] toArray() {\nint size = size();\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] nums = new int[size];\nfor (int i = 0; i < size; i++) {\nnums[i] = get(i);\n}\nreturn nums;\n}\n}\n
my_list.cpp
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate:\nint *nums;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nint numsCapacity = 10; // \u5217\u8868\u5bb9\u91cf\nint numsSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nint extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nMyList() {\nnums = new int[numsCapacity];\n}\n/* \u6790\u6784\u65b9\u6cd5 */\n~MyList() {\ndelete[] nums;\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\nint size() {\nreturn numsSize;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity() {\nreturn numsCapacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(int index) {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(int index, int num) {\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\nnums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(int num) {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size() == capacity())\nextendCapacity();\nnums[size()] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(int index, int num) {\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (size() == capacity())\nextendCapacity();\n// \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int j = size() - 1; j >= index; j--) {\nnums[j + 1] = nums[j];\n}\nnums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u5220\u9664\u5143\u7d20 */\nint remove(int index) {\nif (index < 0 || index >= size())\nthrow out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\nint num = nums[index];\n// \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int j = index; j < size() - 1; j++) {\nnums[j] = nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nint newCapacity = capacity() * extendRatio;\nint *tmp = nums;\nnums = new int[newCapacity];\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nfor (int i = 0; i < size(); i++) {\nnums[i] = tmp[i];\n}\n// \u91ca\u653e\u5185\u5b58\ndelete[] tmp;\nnumsCapacity = newCapacity;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\nvector<int> toVector() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvector<int> vec(size());\nfor (int i = 0; i < size(); i++) {\nvec[i] = nums[i];\n}\nreturn vec;\n}\n};\n
my_list.py
class MyList:\n\"\"\"\u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\nself.__nums: my_list[int] = [0] * self.__capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nself.__size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nself.__extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\nreturn self.__size\ndef capacity(self) -> int:\n\"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\nreturn self.__capacity\ndef get(self, index: int) -> int:\n\"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n# \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\nreturn self.__nums[index]\ndef set(self, num: int, index: int) -> None:\n\"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\nself.__nums[index] = num\ndef add(self, num: int) -> None:\n\"\"\"\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n# \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif self.size() == self.capacity():\nself.extend_capacity()\nself.__nums[self.__size] = num\nself.__size += 1\ndef insert(self, num: int, index: int) -> None:\n\"\"\"\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\n# \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif self.__size == self.capacity():\nself.extend_capacity()\n# \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor j in range(self.__size - 1, index - 1, -1):\nself.__nums[j + 1] = self.__nums[j]\nself.__nums[index] = num\n# \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.__size += 1\ndef remove(self, index: int) -> int:\n\"\"\"\u5220\u9664\u5143\u7d20\"\"\"\nassert index >= 0 and index < self.__size, \"\u7d22\u5f15\u8d8a\u754c\"\nnum = self.__nums[index]\n# \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor j in range(index, self.__size - 1):\nself.__nums[j] = self.__nums[j + 1]\n# \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.__size -= 1\n# \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num\ndef extend_capacity(self) -> None:\n\"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n# \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a self.__size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nself.__nums = self.__nums + [0] * self.capacity() * (self.__extend_ratio - 1)\n# \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nself.__capacity = len(self.__nums)\ndef to_array(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\nreturn self.__nums[: self.__size]\n
my_list.go
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\ntype myList struct {\nnumsCapacity int\nnums         []int\nnumsSize     int\nextendRatio  int\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newMyList() *myList {\nreturn &myList{\nnumsCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\nnums:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nnumsSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nextendRatio:  2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\nreturn l.numsSize\n}\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\nreturn l.numsCapacity\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nreturn l.nums[index]\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nl.nums[index] = num\n}\n/* \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\nif l.numsSize == l.numsCapacity {\nl.extendCapacity()\n}\nl.nums[l.numsSize] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nl.numsSize++\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif l.numsSize == l.numsCapacity {\nl.extendCapacity()\n}\n// \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor j := l.numsSize - 1; j >= index; j-- {\nl.nums[j+1] = l.nums[j]\n}\nl.nums[index] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nl.numsSize++\n}\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\nif index < 0 || index >= l.numsSize {\npanic(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nnum := l.nums[index]\n// \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor j := index; j < l.numsSize-1; j++ {\nl.nums[j] = l.nums[j+1]\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nl.numsSize--\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num\n}\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a self.__size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nl.nums = append(l.nums, make([]int, l.numsCapacity*(l.extendRatio-1))...)\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nl.numsCapacity = len(l.nums)\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\nreturn l.nums[:l.numsSize]\n}\n
my_list.js
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\n#nums = 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\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n#extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor() {\nthis.#nums = new Array(this.#capacity);\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\nsize() {\nreturn this.#size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\ncapacity() {\nreturn this.#capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nget(index) {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nreturn this.#nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nset(index, num) {\nif (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nthis.#nums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nadd(num) {\n// \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\nif (this.#size === this.#capacity) {\nthis.extendCapacity();\n}\n// \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\nthis.#nums[this.#size] = num;\nthis.#size++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\ninsert(index, num) {\nif (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\nif (this.#size === this.#capacity) {\nthis.extendCapacity();\n}\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (let j = this.#size - 1; j >= index; j--) {\nthis.#nums[j + 1] = this.#nums[j];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis.#nums[index] = num;\nthis.#size++;\n}\n/* \u5220\u9664\u5143\u7d20 */\nremove(index) {\nif (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nlet num = this.#nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (let j = index; j < this.#size - 1; j++) {\nthis.#nums[j] = this.#nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis.#size--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\nextendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nthis.#nums = this.#nums.concat(\nnew Array(this.capacity() * (this.#extendRatio - 1))\n);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nthis.#capacity = this.#nums.length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\ntoArray() {\nlet size = this.size();\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst nums = new Array(size);\nfor (let i = 0; i < size; i++) {\nnums[i] = this.get(i);\n}\nreturn nums;\n}\n}\n
my_list.ts
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate nums: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\nprivate _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor() {\nthis.nums = new Array(this._capacity);\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\npublic size(): number {\nreturn this._size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic capacity(): number {\nreturn this._capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\npublic get(index: number): number {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nreturn this.nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic set(index: number, num: number): void {\nif (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nthis.nums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\npublic add(num: number): void {\n// \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\nif (this._size === this._capacity) this.extendCapacity();\n// \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\nthis.nums[this._size] = num;\nthis._size++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\npublic insert(index: number, num: number): void {\nif (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\nif (this._size === this._capacity) {\nthis.extendCapacity();\n}\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (let j = this._size - 1; j >= index; j--) {\nthis.nums[j + 1] = this.nums[j];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis.nums[index] = num;\nthis._size++;\n}\n/* \u5220\u9664\u5143\u7d20 */\npublic remove(index: number): number {\nif (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\nlet num = this.nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (let j = index; j < this._size - 1; j++) {\nthis.nums[j] = this.nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nthis._size--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\npublic extendCapacity(): void {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nthis.nums = this.nums.concat(\nnew Array(this.capacity() * (this.extendRatio - 1))\n);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nthis._capacity = this.nums.length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\npublic toArray(): number[] {\nlet size = this.size();\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst nums = new Array(size);\nfor (let i = 0; i < size; i++) {\nnums[i] = this.get(i);\n}\nreturn nums;\n}\n}\n
my_list.c
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nstruct myList {\nint *nums;       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nint capacity;    // \u5217\u8868\u5bb9\u91cf\nint size;        // \u5217\u8868\u5927\u5c0f\nint extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n};\n/* \u6784\u9020\u51fd\u6570 */\nmyList *newMyList() {\nmyList *list = malloc(sizeof(myList));\nlist->capacity = 10;\nlist->nums = malloc(sizeof(int) * list->capacity);\nlist->size = 0;\nlist->extendRatio = 2;\nreturn list;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(myList *list) {\nfree(list->nums);\nfree(list);\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(myList *list) {\nreturn list->size;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(myList *list) {\nreturn list->capacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(myList *list, int index) {\nassert(index >= 0 && index < list->size);\nreturn list->nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(myList *list, int index, int num) {\nassert(index >= 0 && index < list->size);\nlist->nums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(myList *list, int num) {\nif (size(list) == capacity(list)) {\nextendCapacity(list); // \u6269\u5bb9\n}\nlist->nums[size(list)] = num;\nlist->size++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(myList *list, int index, int num) {\nassert(index >= 0 && index < size(list));\nfor (int i = size(list); i > index; --i) {\nlist->nums[i] = list->nums[i - 1];\n}\nlist->nums[index] = num;\nlist->size++;\n}\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeNum(myList *list, int index) {\nassert(index >= 0 && index < size(list));\nint num = list->nums[index];\nfor (int i = index; i < size(list) - 1; i++) {\nlist->nums[i] = list->nums[i + 1];\n}\nlist->size--;\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(myList *list) {\n// \u5148\u5206\u914d\u7a7a\u95f4\nint newCapacity = capacity(list) * list->extendRatio;\nint *extend = (int *)malloc(sizeof(int) * newCapacity);\nint *temp = list->nums;\n// \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\nfor (int i = 0; i < size(list); i++)\nextend[i] = list->nums[i];\n// \u91ca\u653e\u65e7\u6570\u636e\nfree(temp);\n// \u66f4\u65b0\u65b0\u6570\u636e\nlist->nums = extend;\nlist->capacity = newCapacity;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(myList *list) {\nreturn list->nums;\n}\n
my_list.cs
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList\n{\nprivate int[] nums;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate int numsCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\nprivate int numsSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\npublic MyList()\n{\nnums = new int[numsCapacity];\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\npublic int size()\n{\nreturn numsSize;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic int capacity()\n{\nreturn numsCapacity;\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\npublic int get(int index)\n{\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic void set(int index, int num)\n{\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nnums[index] = num;\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\npublic void add(int num)\n{\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (numsSize == numsCapacity)\nextendCapacity();\nnums[numsSize] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\npublic void insert(int index, int num)\n{\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (numsSize == numsCapacity)\nextendCapacity();\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor (int j = numsSize - 1; j >= index; j--)\n{\nnums[j + 1] = nums[j];\n}\nnums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize++;\n}\n/* \u5220\u9664\u5143\u7d20 */\npublic int remove(int index)\n{\nif (index < 0 || index >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nint num = nums[index];\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor (int j = index; j < numsSize - 1; j++)\n{\nnums[j] = nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nnumsSize--;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n/* \u5217\u8868\u6269\u5bb9 */\npublic void extendCapacity()\n{\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a numsCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nSystem.Array.Resize(ref nums, numsCapacity * extendRatio);\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nnumsCapacity = nums.Length;\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\npublic int[] toArray()\n{\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] nums = new int[numsSize];\nfor (int i = 0; i < numsSize; i++)\n{\nnums[i] = get(i);\n}\nreturn nums;\n}\n}\n
my_list.swift
/* \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0 */\nclass MyList {\nprivate var nums: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nprivate var _capacity = 10 // \u5217\u8868\u5bb9\u91cf\nprivate var _size = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nprivate let extendRatio = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n/* \u6784\u9020\u65b9\u6cd5 */\ninit() {\nnums = Array(repeating: 0, count: _capacity)\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\nfunc size() -> Int {\n_size\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc capacity() -> Int {\n_capacity\n}\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc get(index: Int) -> Int {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nreturn nums[index]\n}\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc set(index: Int, num: Int) {\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nnums[index] = num\n}\n/* \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc add(num: Int) {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif _size == _capacity {\nextendCapacity()\n}\nnums[_size] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n_size += 1\n}\n/* \u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc insert(index: Int, num: Int) {\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif _size == _capacity {\nextendCapacity()\n}\n// \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfor j in sequence(first: _size - 1, next: { $0 >= index + 1 ? $0 - 1 : nil }) {\nnums[j + 1] = nums[j]\n}\nnums[index] = num\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n_size += 1\n}\n/* \u5220\u9664\u5143\u7d20 */\n@discardableResult\nfunc remove(index: Int) -> Int {\nif index < 0 || index >= _size {\nfatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n}\nlet num = nums[index]\n// \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nfor j in index ..< (_size - 1) {\nnums[j] = nums[j + 1]\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n_size -= 1\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num\n}\n/* \u5217\u8868\u6269\u5bb9 */\nfunc extendCapacity() {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nnums = nums + Array(repeating: 0, count: _capacity * (extendRatio - 1))\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n_capacity = nums.count\n}\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\nfunc toArray() -> [Int] {\nvar nums = Array(repeating: 0, count: _size)\nfor i in 0 ..< _size {\nnums[i] = get(index: i)\n}\nreturn nums\n}\n}\n
my_list.zig
// \u5217\u8868\u7c7b\u7b80\u6613\u5b9e\u73b0\nfn MyList(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nnums: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\nnums_capacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\nnum_size: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\nextend_ratio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.nums = try self.mem_allocator.alloc(T, self.nums_capacity);\nstd.mem.set(T, self.nums, @as(T, 0));\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\npub fn size(self: *Self) usize {\nreturn self.num_size;\n}\n// \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\npub fn capacity(self: *Self) usize {\nreturn self.nums_capacity;\n}\n// \u8bbf\u95ee\u5143\u7d20\npub fn get(self: *Self, index: usize) T {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn self.nums[index];\n}  // \u66f4\u65b0\u5143\u7d20\npub fn set(self: *Self, index: usize, num: T) void {\n// \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\nif (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\nself.nums[index] = num;\n}  // \u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\npub fn add(self: *Self, num: T) !void {\n// \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\nif (self.size() == self.capacity()) try self.extendCapacity();\nself.nums[self.size()] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.num_size += 1;\n}  // \u4e2d\u95f4\u63d2\u5165\u5143\u7d20\npub fn insert(self: *Self, index: usize, num: T) !void {\nif (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\nif (self.size() == self.capacity()) try self.extendCapacity();\n// \u7d22\u5f15 i \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nvar j = self.size() - 1;\nwhile (j >= index) : (j -= 1) {\nself.nums[j + 1] = self.nums[j];\n}\nself.nums[index] = num;\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.num_size += 1;\n}\n// \u5220\u9664\u5143\u7d20\npub fn remove(self: *Self, index: usize) T {\nif (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\nvar num = self.nums[index];\n// \u7d22\u5f15 i \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\nvar j = index;\nwhile (j < self.size() - 1) : (j += 1) {\nself.nums[j] = self.nums[j + 1];\n}\n// \u66f4\u65b0\u5143\u7d20\u6570\u91cf\nself.num_size -= 1;\n// \u8fd4\u56de\u88ab\u5220\u9664\u5143\u7d20\nreturn num;\n}\n// \u5217\u8868\u6269\u5bb9\npub fn extendCapacity(self: *Self) !void {\n// \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extend_ratio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u62f7\u8d1d\u5230\u65b0\u6570\u7ec4\nvar newCapacity = self.capacity() * self.extend_ratio;\nvar extend = try self.mem_allocator.alloc(T, newCapacity);\nstd.mem.set(T, extend, @as(T, 0));\n// \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\nstd.mem.copy(T, extend, self.nums);\nself.nums = extend;\n// \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\nself.nums_capacity = newCapacity;\n}\n// \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar nums = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, nums, @as(T, 0));\nfor (nums) |*num, i| {\nnum.* = self.get(i);\n}\nreturn nums;\n}\n};\n}\n
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.4. \u00a0 \u5c0f\u7ed3","text":"
  • \u6570\u7ec4\u548c\u94fe\u8868\u662f\u4e24\u79cd\u57fa\u672c\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u4ee3\u8868\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u79bb\u6563\u7a7a\u95f4\u5b58\u50a8\u65b9\u5f0f\u3002\u4e24\u8005\u7684\u4f18\u7f3a\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\u6307\u9488\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\u5faa\u73af\u94fe\u8868\u3001\u53cc\u5411\u94fe\u8868\u3002
  • \u52a8\u6001\u6570\u7ec4\uff0c\u53c8\u79f0\u5217\u8868\uff0c\u662f\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u4e00\u79cd\u6570\u636e\u7ed3\u6784\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\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u6613\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
  • \u4e0b\u8868\u603b\u7ed3\u5e76\u5bf9\u6bd4\u4e86\u6570\u7ec4\u4e0e\u94fe\u8868\u7684\u5404\u9879\u7279\u6027\u3002
\u6570\u7ec4 \u94fe\u8868 \u5b58\u50a8\u65b9\u5f0f \u8fde\u7eed\u5185\u5b58\u7a7a\u95f4 \u79bb\u6563\u5185\u5b58\u7a7a\u95f4 \u6570\u636e\u7ed3\u6784\u957f\u5ea6 \u957f\u5ea6\u4e0d\u53ef\u53d8 \u957f\u5ea6\u53ef\u53d8 \u5185\u5b58\u4f7f\u7528\u7387 \u5360\u7528\u5185\u5b58\u5c11\u3001\u7f13\u5b58\u5c40\u90e8\u6027\u597d \u5360\u7528\u5185\u5b58\u591a \u4f18\u52bf\u64cd\u4f5c \u968f\u673a\u8bbf\u95ee \u63d2\u5165\u3001\u5220\u9664

\u7f13\u5b58\u5c40\u90e8\u6027

\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6570\u636e\u8bfb\u5199\u901f\u5ea6\u6392\u5e8f\u662f\u201c\u786c\u76d8 < \u5185\u5b58 < CPU \u7f13\u5b58\u201d\u3002\u5f53\u6211\u4eec\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\u94fe\u8868\u5219\u4e0d\u7136\uff0c\u8ba1\u7b97\u673a\u53ea\u80fd\u6328\u4e2a\u5730\u7f13\u5b58\u5404\u4e2a\u8282\u70b9\uff0c\u8fd9\u6837\u7684\u591a\u6b21\u201c\u642c\u8fd0\u201d\u964d\u4f4e\u4e86\u6574\u4f53\u6548\u7387\u3002

  • \u4e0b\u8868\u5bf9\u6bd4\u4e86\u6570\u7ec4\u4e0e\u94fe\u8868\u5728\u5404\u79cd\u64cd\u4f5c\u4e0a\u7684\u6548\u7387\u3002
\u64cd\u4f5c \u6570\u7ec4 \u94fe\u8868 \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_backtracking/backtracking_algorithm/","title":"13.1. \u00a0 \u56de\u6eaf\u7b97\u6cd5","text":"

\u300c\u56de\u6eaf\u7b97\u6cd5 Backtracking Algorithm\u300d\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\u300c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u300d\u6765\u904d\u5386\u89e3\u7a7a\u95f4\u3002\u5728\u4e8c\u53c9\u6811\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\u4e0b\u9762\uff0c\u6211\u4eec\u4ece\u4e8c\u53c9\u6811\u7684\u524d\u5e8f\u904d\u5386\u5165\u624b\uff0c\u9010\u6b65\u4e86\u89e3\u56de\u6eaf\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u4f8b\u9898\u4e00\uff1a\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u5e76\u8fd4\u56de\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9

\u89e3\u9898\u601d\u8def\uff1a\u524d\u5e8f\u904d\u5386\u8fd9\u9897\u6811\uff0c\u5e76\u5224\u65ad\u5f53\u524d\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \uff0c\u82e5\u662f\u5219\u5c06\u8be5\u8282\u70b9\u7684\u503c\u52a0\u5165\u5230\u7ed3\u679c\u5217\u8868 res \u4e4b\u4e2d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig preorder_find_nodes.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\nif (root == null) {\nreturn;\n}\nif (root.val == 7) {\n// \u8bb0\u5f55\u89e3\nres.add(root);\n}\npreOrder(root.left);\npreOrder(root.right);\n}\n
preorder_find_nodes.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\nif (root == nullptr) {\nreturn;\n}\nif (root->val == 7) {\n// \u8bb0\u5f55\u89e3\nres.push_back(root);\n}\npreOrder(root->left);\npreOrder(root->right);\n}\n
preorder_find_nodes.py
def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\nif root.val == 7:\n# \u8bb0\u5f55\u89e3\nres.append(root)\npre_order(root.left)\npre_order(root.right)\n
preorder_find_nodes.go
[class]{}-[func]{preOrder}\n
preorder_find_nodes.js
[class]{}-[func]{preOrder}\n
preorder_find_nodes.ts
[class]{}-[func]{preOrder}\n
preorder_find_nodes.c
[class]{}-[func]{preOrder}\n
preorder_find_nodes.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root)\n{\nif (root == null)\n{\nreturn;\n}\nif (root.val == 7)\n{\n// \u8bb0\u5f55\u89e3\nres.Add(root);\n}\npreOrder(root.left);\npreOrder(root.right);\n}\n
preorder_find_nodes.swift
[class]{}-[func]{preOrder}\n
preorder_find_nodes.zig
[class]{}-[func]{preOrder}\n

Fig. \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\u7ed3\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\u7b49\u4ef7\u4e8e\u51fd\u6570\u8fd4\u56de\u3002\u4e3a\u89e3\u91ca\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u5bf9\u4f8b\u9898\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84

\u89e3\u9898\u601d\u8def\uff1a\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig preorder_find_paths.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\nif (root == null) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.add(root);\nif (root.val == 7) {\n// \u8bb0\u5f55\u89e3\nres.add(new ArrayList<>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.remove(path.size() - 1);\n}\n
preorder_find_paths.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\nif (root == nullptr) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push_back(root);\nif (root->val == 7) {\n// \u8bb0\u5f55\u89e3\nres.push_back(path);\n}\npreOrder(root->left);\npreOrder(root->right);\n// \u56de\u9000\npath.pop_back();\n}\n
preorder_find_paths.py
def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u5c1d\u8bd5\npath.append(root)\nif root.val == 7:\n# \u8bb0\u5f55\u89e3\nres.append(list(path))\npre_order(root.left)\npre_order(root.right)\n# \u56de\u9000\npath.pop()\n
preorder_find_paths.go
[class]{}-[func]{preOrder}\n
preorder_find_paths.js
[class]{}-[func]{preOrder}\n
preorder_find_paths.ts
[class]{}-[func]{preOrder}\n
preorder_find_paths.c
[class]{}-[func]{preOrder}\n
preorder_find_paths.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root)\n{\nif (root == null)\n{\nreturn;\n}\n// \u5c1d\u8bd5\npath.Add(root);\nif (root.val == 7)\n{\n// \u8bb0\u5f55\u89e3\nres.Add(new List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
preorder_find_paths.swift
[class]{}-[func]{preOrder}\n
preorder_find_paths.zig
[class]{}-[func]{preOrder}\n

\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\u6362\u53e5\u8bdd\u8bf4\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\u662f\u4e92\u4e3a\u76f8\u53cd\u7684\u3002

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

"},{"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\uff1a\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\uff0c\u8def\u5f84\u4e2d\u4e0d\u80fd\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9

\u89e3\u9898\u601d\u8def\uff1a\u5728\u4f8b\u9898\u4e8c\u7684\u57fa\u7840\u4e0a\u6dfb\u52a0\u526a\u679d\u64cd\u4f5c\uff0c\u5f53\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u7ec8\u6b62\u7ee7\u7eed\u641c\u7d22\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig preorder_find_constrained_paths.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n// \u526a\u679d\nif (root == null || root.val == 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.add(root);\nif (root.val == 7) {\n// \u8bb0\u5f55\u89e3\nres.add(new ArrayList<>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.remove(path.size() - 1);\n}\n
preorder_find_constrained_paths.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n// \u526a\u679d\nif (root == nullptr || root->val == 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push_back(root);\nif (root->val == 7) {\n// \u8bb0\u5f55\u89e3\nres.push_back(path);\n}\npreOrder(root->left);\npreOrder(root->right);\n// \u56de\u9000\npath.pop_back();\n}\n
preorder_find_constrained_paths.py
def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n# \u526a\u679d\nif root is None or root.val == 3:\nreturn\n# \u5c1d\u8bd5\npath.append(root)\nif root.val == 7:\n# \u8bb0\u5f55\u89e3\nres.append(list(path))\npre_order(root.left)\npre_order(root.right)\n# \u56de\u9000\npath.pop()\n
preorder_find_constrained_paths.go
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.js
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.ts
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.c
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root)\n{\n// \u526a\u679d\nif (root == null || root.val == 3)\n{\nreturn;\n}\n// \u5c1d\u8bd5\npath.Add(root);\nif (root.val == 7)\n{\n// \u8bb0\u5f55\u89e3\nres.Add(new List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
preorder_find_constrained_paths.swift
[class]{}-[func]{preOrder}\n
preorder_find_constrained_paths.zig
[class]{}-[func]{preOrder}\n

\u526a\u679d\u662f\u4e00\u4e2a\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8bcd\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u5229\u7528\u7ea6\u675f\u6761\u4ef6\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\u5347\u641c\u7d22\u6548\u7387\u3002

Fig. \u6839\u636e\u7ea6\u675f\u6761\u4ef6\u526a\u679d

"},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3. \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\u3002

\u540d\u8bcd \u5b9a\u4e49 \u4f8b\u9898\u4e09 \u89e3 Solution \u89e3\u662f\u6ee1\u8db3\u95ee\u9898\u7279\u5b9a\u6761\u4ef6\u7684\u7b54\u6848\u3002\u56de\u6eaf\u7b97\u6cd5\u7684\u76ee\u6807\u662f\u627e\u5230\u4e00\u4e2a\u6216\u591a\u4e2a\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3 \u6839\u8282\u70b9\u5230\u8282\u70b9 \\(7\\) \u7684\u6240\u6709\u8def\u5f84\uff0c\u4e14\u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9 \u72b6\u6001 State \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 \u7ea6\u675f\u6761\u4ef6 Constraint \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 \u8981\u6c42\u8def\u5f84\u4e2d\u4e0d\u80fd\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9 \u5c1d\u8bd5 Attempt \u5c1d\u8bd5\u662f\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6839\u636e\u5f53\u524d\u72b6\u6001\u548c\u53ef\u7528\u9009\u62e9\u6765\u63a2\u7d22\u89e3\u7a7a\u95f4\u7684\u8fc7\u7a0b\u3002\u5c1d\u8bd5\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 Backtracking \u56de\u9000\u6307\u5728\u641c\u7d22\u4e2d\u9047\u5230\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u6216\u65e0\u6cd5\u7ee7\u7eed\u641c\u7d22\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\u7ed3\u70b9\u3001\u7ed3\u675f\u7ed3\u70b9\u8bbf\u95ee\u3001\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\u7ec8\u6b62\u641c\u7d22\uff0c\u51fd\u6570\u8fd4\u56de \u526a\u679d Pruning \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\u7ec8\u6b62\u7ee7\u7eed\u641c\u7d22

Tip

\u89e3\u3001\u72b6\u6001\u3001\u7ea6\u675f\u6761\u4ef6\u7b49\u672f\u8bed\u662f\u901a\u7528\u7684\uff0c\u9002\u7528\u4e8e\u56de\u6eaf\u7b97\u6cd5\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4. \u00a0 \u6846\u67b6\u4ee3\u7801","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\u4e3a\u63d0\u5347\u4ee3\u7801\u901a\u7528\u6027\uff0c\u6211\u4eec\u5e0c\u671b\u5c06\u56de\u6eaf\u7b97\u6cd5\u7684\u201c\u5c1d\u8bd5\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u4f53\u6846\u67b6\u63d0\u70bc\u51fa\u6765\u3002

\u8bbe state \u4e3a\u95ee\u9898\u7684\u5f53\u524d\u72b6\u6001\uff0cchoices \u8868\u793a\u5f53\u524d\u72b6\u6001\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9009\u62e9\uff0c\u5219\u53ef\u5f97\u5230\u4ee5\u4e0b\u56de\u6eaf\u7b97\u6cd5\u7684\u6846\u67b6\u4ee3\u7801\u3002

def backtrack(state, choices, res):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\"\"\"\n# \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif is_solution(state):\n# \u8bb0\u5f55\u89e3\nrecord_solution(state, res)\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices:\n# \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif is_valid(state, choice):\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmake_choice(state, choice)\nbacktrack(state, choices, res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundo_choice(state, choice)\n

\u4e0b\u9762\uff0c\u6211\u4eec\u5c1d\u8bd5\u57fa\u4e8e\u6b64\u6846\u67b6\u6765\u89e3\u51b3\u4f8b\u9898\u4e09\u3002\u5728\u4f8b\u9898\u4e09\u4e2d\uff0c\u72b6\u6001 state \u662f\u8282\u70b9\u904d\u5386\u8def\u5f84\uff0c\u9009\u62e9 choices \u662f\u5f53\u524d\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\uff0c\u7ed3\u679c res \u662f\u8def\u5f84\u5217\u8868\uff0c\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig backtrack_find_constrained_paths.java
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nboolean isSolution(List<TreeNode> state) {\nreturn !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\nres.add(new ArrayList<>(state));\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) {\nreturn choice != null && choice.val != 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\nstate.add(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\nstate.remove(state.size() - 1);\n}\n/* \u56de\u6eaf\u7b97\u6cd5 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (TreeNode choice : choices) {\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, choice);\nbacktrack(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\nundoChoice(state, choice);\n}\n}\n}\n
backtrack_find_constrained_paths.cpp
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\nreturn !state.empty() && state.back()->val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\nres.push_back(state);\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) {\nreturn choice != nullptr && choice->val != 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\nstate.push_back(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\nstate.pop_back();\n}\n/* \u56de\u6eaf\u7b97\u6cd5 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (TreeNode *choice : choices) {\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, choice);\nvector<TreeNode *> nextChoices{choice->left, choice->right};\nbacktrack(state, nextChoices, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state, choice);\n}\n}\n}\n
backtrack_find_constrained_paths.py
def is_solution(state: list[TreeNode]) -> bool:\n\"\"\"\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3\"\"\"\nreturn state and state[-1].val == 7\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n\"\"\"\u8bb0\u5f55\u89e3\"\"\"\nres.append(list(state))\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\"\"\"\nreturn choice is not None and choice.val != 3\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n\"\"\"\u66f4\u65b0\u72b6\u6001\"\"\"\nstate.append(choice)\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n\"\"\"\u6062\u590d\u72b6\u6001\"\"\"\nstate.pop()\ndef backtrack(state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\"\"\"\n# \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif is_solution(state):\n# \u8bb0\u5f55\u89e3\nrecord_solution(state, res)\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices:\n# \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif is_valid(state, choice):\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmake_choice(state, choice)\nbacktrack(state, [choice.left, choice.right], res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundo_choice(state, choice)\n
backtrack_find_constrained_paths.go
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.js
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.ts
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.c
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.cs
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state)\n{\nreturn state.Count != 0 && state[^1].val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res)\n{\nres.Add(new List<TreeNode>(state));\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{\nreturn choice != null && choice.val != 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice)\n{\nstate.Add(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice)\n{\nstate.RemoveAt(state.Count - 1);\n}\n/* \u56de\u6eaf\u7b97\u6cd5 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res)\n{\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state))\n{\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nforeach (TreeNode choice in choices)\n{\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, choice))\n{\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, choice);\nList<TreeNode> nextChoices = new List<TreeNode>() { choice.left, choice.right };\nbacktrack(state, nextChoices, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state, choice);\n}\n}\n}\n
backtrack_find_constrained_paths.swift
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n
backtrack_find_constrained_paths.zig
[class]{}-[func]{isSolution}\n[class]{}-[func]{recordSolution}\n[class]{}-[func]{isValid}\n[class]{}-[func]{makeChoice}\n[class]{}-[func]{undoChoice}\n[class]{}-[func]{backtrack}\n

\u76f8\u8f83\u4e8e\u57fa\u4e8e\u524d\u5e8f\u904d\u5386\u7684\u5b9e\u73b0\u4ee3\u7801\uff0c\u57fa\u4e8e\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\u7684\u5b9e\u73b0\u4ee3\u7801\u867d\u7136\u663e\u5f97\u5570\u55e6\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u4e0d\u540c\u7684\u56de\u6eaf\u7b97\u6cd5\u95ee\u9898\u3002\u5b9e\u9645\u4e0a\uff0c\u6240\u6709\u56de\u6eaf\u95ee\u9898\u90fd\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u53ea\u9700\u8981\u6839\u636e\u95ee\u9898\u7279\u70b9\u6765\u5b9a\u4e49\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u53d8\u91cf\uff0c\u5b9e\u73b0\u5404\u4e2a\u65b9\u6cd5\u5373\u53ef\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5. \u00a0 \u5178\u578b\u4f8b\u9898","text":"

\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\u4e2a\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5706\u76d8\uff0c\u8981\u6c42\u5c06\u6240\u6709\u5706\u76d8\u4ece\u4e00\u4e2a\u67f1\u5b50\u79fb\u52a8\u5230\u53e6\u4e00\u4e2a\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

\u5728\u63a5\u4e0b\u6765\u7684\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4e00\u8d77\u653b\u514b\u51e0\u4e2a\u7ecf\u5178\u7684\u56de\u6eaf\u7b97\u6cd5\u95ee\u9898\u3002

"},{"location":"chapter_binary_search/binary_search/","title":"6.1. \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

\u300c\u4e8c\u5206\u67e5\u627e Binary Search\u300d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u6bcf\u8f6e\u51cf\u5c11\u4e00\u534a\u641c\u7d22\u8303\u56f4\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u3002\u6570\u7ec4\u7d22\u5f15\u7684\u53d6\u503c\u8303\u56f4\u4e3a\uff1a

\\[ 0, 1, 2, \\cdots, n-1 \\]

\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4ee5\u4e0b\u4e24\u79cd\u65b9\u6cd5\u6765\u8868\u793a\u8fd9\u4e2a\u53d6\u503c\u8303\u56f4\uff1a

  1. \u53cc\u95ed\u533a\u95f4 \\([0, n-1]\\) \uff0c\u5373\u4e24\u4e2a\u8fb9\u754c\u90fd\u5305\u542b\u81ea\u8eab\uff1b\u5728\u6b64\u65b9\u6cd5\u4e0b\uff0c\u533a\u95f4 \\([i, i]\\) \u4ecd\u5305\u542b \\(1\\) \u4e2a\u5143\u7d20\uff1b
  2. \u5de6\u95ed\u53f3\u5f00 \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\u3001\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\uff1b\u5728\u6b64\u65b9\u6cd5\u4e0b\uff0c\u533a\u95f4 \\([i, i)\\) \u4e0d\u5305\u542b\u5143\u7d20\uff1b
"},{"location":"chapter_binary_search/binary_search/#611","title":"6.1.1. \u00a0 \u53cc\u95ed\u533a\u95f4\u5b9e\u73b0","text":"

\u9996\u5148\uff0c\u6211\u4eec\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u6cd5\uff0c\u5728\u6570\u7ec4 nums \u4e2d\u67e5\u627e\u76ee\u6807\u5143\u7d20 target \u7684\u5bf9\u5e94\u7d22\u5f15\u3002

<1><2><3><4><5><6><7>

\u4e8c\u5206\u67e5\u627e\u5728\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u4e0b\u7684\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint 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\nwhile (i <= j) {\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\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\nint 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\nwhile (i <= j) {\nint m = (i + j) / 2;  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
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\ni, j = 0, len(nums) - 1\nwhile i <= j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\nelif nums[m] > target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\nelse:\nreturn m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\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\ni, 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\nfor i <= j {\nm := (i + j) / 2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -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\nlet i = 0,\nj = 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\nwhile (i <= j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\nconst m = parseInt((i + j) / 2);\nif (nums[m] < target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse 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\nreturn -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\nlet i = 0,\nj = 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\nwhile (i <= j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nconst m = Math.floor((i + j) / 2);\nif (nums[m] < target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\n} else if (nums[m] > target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\n} else {\n// \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n}\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -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 left, right \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\nint left = 0, right = len - 1;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 left > right \u65f6\u4e3a\u7a7a\uff09\nwhile (left <= right) {\nint mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 mid\nif (nums[mid] < target)       // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [mid+1, right] \u4e2d\nleft = mid + 1;\nelse if (nums[mid] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [left, mid-1] \u4e2d\nright = mid - 1;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn mid;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target)\n{\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\nint 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\nwhile (i <= j)\n{\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -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\nvar i = 0\nvar j = nums.count - 1\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\nwhile i <= j {\nlet m = (i + j) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\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\nvar i: usize = 0;\nvar 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\nwhile (i <= j) {\nvar m = (i + j) / 2;                    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1;\n} else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1;\n} else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn @intCast(T, m);\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u6570\u7ec4\u957f\u5ea6\u975e\u5e38\u5927\u65f6\uff0c\u52a0\u6cd5 \\(i + j\\) \u7684\u7ed3\u679c\u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u9700\u8981\u91c7\u7528\u4e00\u79cd\u66f4\u5b89\u5168\u7684\u8ba1\u7b97\u4e2d\u70b9\u7684\u65b9\u6cd5\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
# Python \u4e2d\u7684\u6570\u5b57\u7406\u8bba\u4e0a\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\n# \u56e0\u6b64\u65e0\u9700\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nm := (i + j) / 2\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nm := i + (j - i) / 2\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nlet m = parseInt((i + j) / 2);\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nlet m = parseInt(i + (j - i) / 2);\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa Number \u7684\u53d6\u503c\u8303\u56f4\nlet m = Math.floor((i + j) / 2);\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nlet m = Math.floor(i + (j - i) / 2);\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nint m = (i + j) / 2;\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nint m = i + (j - i) / 2;\n
// (i + j) \u6709\u53ef\u80fd\u8d85\u51fa int \u7684\u53d6\u503c\u8303\u56f4\nlet m = (i + j) / 2\n// \u66f4\u6362\u4e3a\u6b64\u5199\u6cd5\u5219\u4e0d\u4f1a\u8d8a\u754c\nlet m = i + (j - 1) / 2\n
\n
"},{"location":"chapter_binary_search/binary_search/#612","title":"6.1.2. \u00a0 \u5de6\u95ed\u53f3\u5f00\u5b9e\u73b0","text":"

\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u7684\u8868\u793a\u6cd5\uff0c\u7f16\u5199\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search.java
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(int[] nums, int target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint 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\nwhile (i < j) {\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.cpp
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(vector<int> &nums, int target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint 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\nwhile (i < j) {\nint m = (i + j) / 2;  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.py
def binary_search1(nums: list[int], target: int) -> int:\n\"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09\"\"\"\n# \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\ni, 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\nwhile i < j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1\nelif nums[m] > target:  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m\nelse:  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.go
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunc binarySearch1(nums []int, target int) int {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\ni, 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\nfor i < j {\nm := (i + j) / 2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\n
binary_search.js
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunction binarySearch1(nums, target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nlet i = 0,\nj = nums.length;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\nwhile (i < j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\nconst m = parseInt((i + j) / 2);\nif (nums[m] < target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target)\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\n// \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nelse return m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunction binarySearch1(nums: number[], target: number): number {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nlet i = 0,\nj = nums.length;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\nwhile (i < j) {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nconst m = Math.floor((i + j) / 2);\nif (nums[m] < target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\n} else if (nums[m] > target) {\n// \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\n} else {\n// \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n}\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.c
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(int *nums, int len, int target) {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 left, right \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint left = 0, right = len;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 left = right \u65f6\u4e3a\u7a7a\uff09\nwhile (left < right) {\nint mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 mid\nif (nums[mid] < target)       // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [mid+1, right) \u4e2d\nleft = mid + 1;\nelse if (nums[mid] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [left, mid) \u4e2d\nright = mid;\nelse // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn mid;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearch1(int[] nums, int target)\n{\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nint 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\nwhile (i < j)\n{\nint m = (i + j) / 2;       // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\nelse if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\nelse                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m;\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n
binary_search.swift
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunc binarySearch1(nums: [Int], target: Int) -> Int {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nvar i = 0\nvar j = nums.count\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\nwhile i < j {\nlet m = (i + j) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1\n} else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m\n} else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn m\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\n
binary_search.zig
// \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09\nfn binarySearch1(comptime T: type, nums: std.ArrayList(T), target: T) T {\n// \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\nvar i: usize = 0;\nvar 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\nwhile (i <= j) {\nvar m = (i + j) / 2;                    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\ni = m + 1;\n} else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\nj = m;\n} else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\nreturn @intCast(T, m);\n}\n}\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1;\n}\n

\u5bf9\u6bd4\u8fd9\u4e24\u79cd\u4ee3\u7801\u5199\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u53d1\u73b0\u4ee5\u4e0b\u4e0d\u540c\u70b9\uff1a

\u8868\u793a\u65b9\u6cd5 \u521d\u59cb\u5316\u6307\u9488 \u7f29\u5c0f\u533a\u95f4 \u5faa\u73af\u7ec8\u6b62\u6761\u4ef6 \u53cc\u95ed\u533a\u95f4 \\([0, n-1]\\) \\(i = 0\\) , \\(j = n-1\\) \\(i = m + 1\\) , \\(j = m - 1\\) \\(i > j\\) \u5de6\u95ed\u53f3\u5f00 \\([0, n)\\) \\(i = 0\\) , \\(j = n\\) \\(i = m + 1\\) , \\(j = m\\) \\(i = j\\)

\u5728\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u6cd5\u4e2d\uff0c\u7531\u4e8e\u5bf9\u5de6\u53f3\u4e24\u8fb9\u754c\u7684\u5b9a\u4e49\u76f8\u540c\uff0c\u56e0\u6b64\u7f29\u5c0f\u533a\u95f4\u7684 \\(i\\) \u548c \\(j\\) \u7684\u5904\u7406\u65b9\u6cd5\u4e5f\u662f\u5bf9\u79f0\u7684\uff0c\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\u3002\u56e0\u6b64\uff0c\u5efa\u8bae\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

"},{"location":"chapter_binary_search/binary_search/#613","title":"6.1.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(\\log n)\\) \uff1a\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u957f\u5ea6\uff1b\u6bcf\u8f6e\u6392\u9664\u4e00\u534a\u7684\u533a\u95f4\uff0c\u56e0\u6b64\u5faa\u73af\u8f6e\u6570\u4e3a \\(\\log_2 n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \uff1a\u6307\u9488 i , j \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7a7a\u95f4\u3002

"},{"location":"chapter_binary_search/binary_search/#614","title":"6.1.4. \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u5206\u67e5\u627e\u6548\u7387\u5f88\u9ad8\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\uff1a

  • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u8f83\u4f4e\u3002\u5bf9\u6570\u9636\u5728\u5927\u6570\u636e\u91cf\u60c5\u51b5\u4e0b\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\u9700\u989d\u5916\u7a7a\u95f4\u3002\u4e0e\u54c8\u5e0c\u67e5\u627e\u76f8\u6bd4\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

\u7136\u800c\uff0c\u5e76\u975e\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u53ef\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\uff0c\u539f\u56e0\u5982\u4e0b\uff1a

  • \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\u8981 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_computational_complexity/performance_evaluation/","title":"2.1. \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30","text":""},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1. \u00a0 \u7b97\u6cd5\u8bc4\u4ef7\u7ef4\u5ea6","text":"

\u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u7b97\u6cd5\u8bbe\u8ba1\u8ffd\u6c42\u4ee5\u4e0b\u4e24\u4e2a\u5c42\u9762\u7684\u76ee\u6807\uff1a

  1. \u627e\u5230\u95ee\u9898\u89e3\u6cd5\u3002\u7b97\u6cd5\u9700\u8981\u5728\u89c4\u5b9a\u7684\u8f93\u5165\u8303\u56f4\u5185\uff0c\u53ef\u9760\u5730\u6c42\u5f97\u95ee\u9898\u7684\u6b63\u786e\u89e3\u3002
  2. \u5bfb\u6c42\u6700\u4f18\u89e3\u6cd5\u3002\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

\u56e0\u6b64\uff0c\u5728\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u7684\u524d\u63d0\u4e0b\uff0c\u7b97\u6cd5\u6548\u7387\u6210\u4e3a\u4e3b\u8981\u7684\u8bc4\u4ef7\u7ef4\u5ea6\uff0c\u4e3b\u8981\u5305\u62ec\uff1a

  • \u65f6\u95f4\u6548\u7387\uff0c\u5373\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
  • \u7a7a\u95f4\u6548\u7387\uff0c\u5373\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\u638c\u63e1\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u7684\u65b9\u6cd5\u5219\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u53ea\u6709\u4e86\u89e3\u8bc4\u4ef7\u6807\u51c6\uff0c\u6211\u4eec\u624d\u80fd\u8fdb\u884c\u7b97\u6cd5\u4e4b\u95f4\u7684\u5bf9\u6bd4\u5206\u6790\uff0c\u4ece\u800c\u6307\u5bfc\u7b97\u6cd5\u8bbe\u8ba1\u4e0e\u4f18\u5316\u8fc7\u7a0b\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2. \u00a0 \u6548\u7387\u8bc4\u4f30\u65b9\u6cd5","text":""},{"location":"chapter_computational_complexity/performance_evaluation/#_1","title":"\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\u6211\u4eec\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u5c31\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\u5c40\u9650\u6027\u3002

\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\u8868\u73b0\u3002\u4f8b\u5982\uff0c\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\u6211\u4eec\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\u800c\u8fd9\u662f\u4e0d\u73b0\u5b9e\u7684\u3002

\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\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u53ef\u80fd\u77ed\u4e8e\u7b97\u6cd5 B\uff1b\u800c\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5927\u65f6\uff0c\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\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\u8fd9\u6837\u9700\u8981\u5360\u7528\u5927\u91cf\u7684\u8ba1\u7b97\u8d44\u6e90\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#_2","title":"\u7406\u8bba\u4f30\u7b97","text":"

\u7531\u4e8e\u5b9e\u9645\u6d4b\u8bd5\u5177\u6709\u8f83\u5927\u7684\u5c40\u9650\u6027\uff0c\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\u300c\u590d\u6742\u5ea6\u5206\u6790 Complexity Analysis\u300d\u6216\u300c\u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 Asymptotic Complexity Analysis\u300d\u3002

\u590d\u6742\u5ea6\u5206\u6790\u8bc4\u4f30\u7684\u662f\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u589e\u591a\u65f6\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\uff1a

  • \u201c\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u201d\u53ef\u5206\u4e3a\u201c\u8fd0\u884c\u65f6\u95f4\u201d\u548c\u201c\u5360\u7528\u7a7a\u95f4\u201d\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5c06\u590d\u6742\u5ea6\u5206\u4e3a\u300c\u65f6\u95f4\u590d\u6742\u5ea6 Time Complexity\u300d\u548c\u300c\u7a7a\u95f4\u590d\u6742\u5ea6 Space Complexity\u300d\uff1b
  • \u201c\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u589e\u591a\u65f6\u201d\u8868\u793a\u590d\u6742\u5ea6\u4e0e\u8f93\u5165\u6570\u636e\u91cf\u6709\u5173\uff0c\u53cd\u6620\u4e86\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u4e0e\u8f93\u5165\u6570\u636e\u91cf\u4e4b\u95f4\u7684\u5173\u7cfb\uff1b
  • \u201c\u589e\u957f\u8d8b\u52bf\u201d\u8868\u793a\u590d\u6742\u5ea6\u5206\u6790\u5173\u6ce8\u7684\u662f\u7b97\u6cd5\u65f6\u95f4\u4e0e\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\uff0c\u800c\u975e\u5177\u4f53\u7684\u8fd0\u884c\u65f6\u95f4\u6216\u5360\u7528\u7a7a\u95f4\uff1b

\u590d\u6742\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5b9e\u9645\u6d4b\u8bd5\u65b9\u6cd5\u7684\u5f0a\u7aef\u3002\u9996\u5148\uff0c\u5b83\u72ec\u7acb\u4e8e\u6d4b\u8bd5\u73af\u5883\uff0c\u56e0\u6b64\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\u3002\u5176\u6b21\uff0c\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

\u5982\u679c\u4f60\u5bf9\u590d\u6742\u5ea6\u5206\u6790\u7684\u6982\u5ff5\u4ecd\u611f\u5230\u56f0\u60d1\uff0c\u65e0\u9700\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u7ae0\u8282\u8be6\u7ec6\u4ecb\u7ecd\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#213","title":"2.1.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790\u91cd\u8981\u6027","text":"

\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\u544a\u8bc9\u6211\u4eec\u6267\u884c\u67d0\u4e2a\u7b97\u6cd5\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\uff0c\u5e76\u4f7f\u6211\u4eec\u80fd\u591f\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\u7b2c\u4e00\u7ae0\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\u6211\u4eec\u96be\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u8fd0\u884c\u901f\u5ea6\u548c\u7a7a\u95f4\u4f7f\u7528\u60c5\u51b5\u3002\u56e0\u6b64\uff0c\u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u524d\uff0c\u5efa\u8bae\u8bfb\u8005\u5148\u5bf9\u590d\u6742\u5ea6\u5efa\u7acb\u521d\u6b65\u7684\u4e86\u89e3\uff0c\u5e76\u80fd\u591f\u5b8c\u6210\u7b80\u5355\u6848\u4f8b\u7684\u590d\u6742\u5ea6\u5206\u6790\u3002

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.3. \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6","text":"

\u300c\u7a7a\u95f4\u590d\u6742\u5ea6 Space Complexity\u300d\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u4f7f\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\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#231","title":"2.3.1. \u00a0 \u7b97\u6cd5\u76f8\u5173\u7a7a\u95f4","text":"

\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\uff1a

  • \u300c\u8f93\u5165\u7a7a\u95f4\u300d\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u5165\u6570\u636e\uff1b
  • \u300c\u6682\u5b58\u7a7a\u95f4\u300d\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u53d8\u91cf\u3001\u5bf9\u8c61\u3001\u51fd\u6570\u4e0a\u4e0b\u6587\u7b49\u6570\u636e\uff1b
  • \u300c\u8f93\u51fa\u7a7a\u95f4\u300d\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u51fa\u6570\u636e\uff1b

\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7edf\u8ba1\u8303\u56f4\u662f\u300c\u6682\u5b58\u7a7a\u95f4\u300d+\u300c\u8f93\u51fa\u7a7a\u95f4\u300d\u3002

\u6682\u5b58\u7a7a\u95f4\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a

  • \u300c\u6682\u5b58\u6570\u636e\u300d\u7528\u4e8e\u4fdd\u5b58\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5404\u79cd\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u7b49\u3002
  • \u300c\u6808\u5e27\u7a7a\u95f4\u300d\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
  • \u300c\u6307\u4ee4\u7a7a\u95f4\u300d\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

\u56e0\u6b64\uff0c\u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5e8f\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u65f6\uff0c\u6211\u4eec\u4e00\u822c\u7edf\u8ba1 \u6682\u5b58\u6570\u636e\u3001\u8f93\u51fa\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4 \u4e09\u90e8\u5206\u3002

Fig. \u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u5173\u7a7a\u95f4

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u7c7b */\nclass Node {\nint val;\nNode next;\nNode(int x) { val = x; }\n}\n/* \u51fd\u6570 */\nint function() {\n// do something...\nreturn 0;\n}\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\nfinal int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nNode node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nint c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7ed3\u6784\u4f53 */\nstruct Node {\nint val;\nNode *next;\nNode(int x) : val(x), next(nullptr) {}\n};\n/* \u51fd\u6570 */\nint func() {\n// do something...\nreturn 0;\n}\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\nconst int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nNode* node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nint c = func();           // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
class Node:\n\"\"\"\u7c7b\"\"\"\ndef __init__(self, x: int):\nself.val: int = x                 # \u8282\u70b9\u503c\nself.next: Optional[Node] = None  # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\uff08\u5f15\u7528\uff09\ndef function() -> int:\n\"\"\"\u51fd\u6570\"\"\"\n# do something...\nreturn 0\ndef algorithm(n) -> int:  # \u8f93\u5165\u6570\u636e\nA: int = 0            # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\nb: int = 0            # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nnode = Node(0)        # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nc: int = function()   # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn A + b + c      # \u8f93\u51fa\u6570\u636e\n
/* \u7ed3\u6784\u4f53 */\ntype node struct {\nval  int\nnext *node\n}\n/* \u521b\u5efa node \u7ed3\u6784\u4f53  */\nfunc newNode(val int) *node {\nreturn &node{val: val}\n}\n/* \u51fd\u6570 */\nfunc function() int {\n// do something...\nreturn 0\n}\nfunc algorithm(n int) int { // \u8f93\u5165\u6570\u636e\nconst a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nb := 0                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nnewNode(0)              // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nc := function()         // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c        // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\nval;\nnext;\nconstructor(val) {\nthis.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\nthis.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n/* \u51fd\u6570 */\nfunction constFunc() {\n// do something\nreturn 0;\n}\nfunction algorithm(n) {       // \u8f93\u5165\u6570\u636e\nconst a = 0;              // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nlet b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nconst node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nconst c = constFunc();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\nval: number;\nnext: Node | null;\nconstructor(val?: number) {\nthis.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\nthis.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n}\n/* \u51fd\u6570 */\nfunction constFunc(): number {\n// do something\nreturn 0;\n}\nfunction algorithm(n: number): number { // \u8f93\u5165\u6570\u636e\nconst a = 0;                        // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nlet b = 0;                          // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nconst node = new Node(0);           // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nconst c = constFunc();              // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;                   // \u8f93\u51fa\u6570\u636e\n}\n
/* \u51fd\u6570 */\nint func() {\n// do something...\nreturn 0;\n}\nint algorithm(int n) { // \u8f93\u5165\u6570\u636e\nconst int a = 0;   // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;         // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nint c = func();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;  // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node\n{\nint val;\nNode next;\nNode(int x) { val = x; }\n}\n/* \u51fd\u6570 */\nint function()\n{\n// do something...\nreturn 0;\n}\nint algorithm(int n)          // \u8f93\u5165\u6570\u636e\n{\nconst int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nint b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nNode node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nint c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\nvar val: Int\nvar next: Node?\ninit(x: Int) {\nval = x\n}\n}\n/* \u51fd\u6570 */\nfunc function() -> Int {\n// do something...\nreturn 0\n}\nfunc algorithm(n: Int) -> Int { // \u8f93\u5165\u6570\u636e\nlet a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\nvar b = 0             // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nlet node = Node(x: 0) // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\nlet c = function()    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\nreturn a + b + c      // \u8f93\u51fa\u6570\u636e\n}\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#232","title":"2.3.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\u662f\u5c06\u7edf\u8ba1\u5bf9\u8c61\u4ece\u201c\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u201d\u8f6c\u4e3a\u201c\u4f7f\u7528\u7a7a\u95f4\u5927\u5c0f\u201d\u3002\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u300c\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u300d\uff0c\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

\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u4e24\u5c42\u542b\u4e49\uff0c\u5206\u522b\u662f\u8f93\u5165\u6570\u636e\u7684\u6700\u5dee\u5206\u5e03\u548c\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u6700\u5dee\u65f6\u95f4\u70b9\u3002

  • \u4ee5\u6700\u5dee\u8f93\u5165\u6570\u636e\u4e3a\u51c6\u3002\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\uff1b\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b
  • \u4ee5\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5cf0\u503c\u5185\u5b58\u4e3a\u51c6\u3002\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\uff1b\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
void algorithm(int n) {\nint a = 0;                   // O(1)\nint[] b = new int[10000];    // O(1)\nif (n > 10)\nint[] nums = new int[n]; // O(n)\n}\n
void algorithm(int n) {\nint a = 0;               // O(1)\nvector<int> b(10000);    // O(1)\nif (n > 10)\nvector<int> nums(n); // O(n)\n}\n
def algorithm(n: int) -> None:\na: int = 0                     # O(1)\nb: List[int] = [0] * 10000     # O(1)\nif n > 10:\nnums: List[int] = [0] * n  # O(n)\n
func algorithm(n int) {\na := 0                      // O(1)\nb := make([]int, 10000)     // O(1)\nvar nums []int\nif n > 10 {\nnums := make([]int, n)  // O(n)\n}\nfmt.Println(a, b, nums)\n}\n
function algorithm(n) {\nconst a = 0;                   // O(1)\nconst b = new Array(10000);    // O(1)\nif (n > 10) {\nconst nums = new Array(n); // O(n)\n}\n}\n
function algorithm(n: number): void {\nconst a = 0;                   // O(1)\nconst b = new Array(10000);    // O(1)\nif (n > 10) {\nconst nums = new Array(n); // O(n)\n}\n}\n
void algorithm(int n) {\nint a = 0;               // O(1)\nint b[10000];            // O(1)\nif (n > 10)\nvector<int> nums(n); // O(n)\n}\n
void algorithm(int n)\n{\nint a = 0;                   // O(1)\nint[] b = new int[10000];    // O(1)\nif (n > 10)\n{\nint[] nums = new int[n]; // O(n)\n}\n}\n
func algorithm(n: Int) {\nlet a = 0 // O(1)\nlet b = Array(repeating: 0, count: 10000) // O(1)\nif n > 10 {\nlet nums = Array(repeating: 0, count: n) // O(n)\n}\n}\n
\n

\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7edf\u8ba1\u6808\u5e27\u7a7a\u95f4\u3002\u4f8b\u5982\uff0c\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\u800c\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
int function() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n) {\nfor (int i = 0; i < n; i++) {\nfunction();\n}\n}\n/* \u9012\u5f52 O(n) */\nvoid recur(int n) {\nif (n == 1) return;\nreturn recur(n - 1);\n}\n
int func() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n) {\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nvoid recur(int n) {\nif (n == 1) return;\nreturn recur(n - 1);\n}\n
def function() -> int:\n# do something\nreturn 0\ndef loop(n: int) -> None:\n\"\"\"\u5faa\u73af O(1)\"\"\"\nfor _ in range(n):\nfunction()\ndef recur(n: int) -> int:\n\"\"\"\u9012\u5f52 O(n)\"\"\"\nif n == 1: return\nreturn recur(n - 1)\n
func function() int {\n// do something\nreturn 0\n}\n/* \u5faa\u73af O(1) */\nfunc loop(n int) {\nfor i := 0; i < n; i++ {\nfunction()\n}\n}\n/* \u9012\u5f52 O(n) */\nfunc recur(n int) {\nif n == 1 {\nreturn\n}\nrecur(n - 1)\n}\n
function constFunc() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nfunction loop(n) {\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nfunction recur(n) {\nif (n === 1) return;\nreturn recur(n - 1);\n}\n
function constFunc(): number {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nfunction loop(n: number): void {\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nfunction recur(n: number): void {\nif (n === 1) return;\nreturn recur(n - 1);\n}\n
int func() {\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n) {\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n/* \u9012\u5f52 O(n) */\nvoid recur(int n) {\nif (n == 1) return;\nreturn recur(n - 1);\n}\n
int function()\n{\n// do something\nreturn 0;\n}\n/* \u5faa\u73af O(1) */\nvoid loop(int n)\n{\nfor (int i = 0; i < n; i++)\n{\nfunction();\n}\n}\n/* \u9012\u5f52 O(n) */\nint recur(int n)\n{\nif (n == 1) return 1;\nreturn recur(n - 1);\n}\n
@discardableResult\nfunc function() -> Int {\n// do something\nreturn 0\n}\n/* \u5faa\u73af O(1) */\nfunc loop(n: Int) {\nfor _ in 0 ..< n {\nfunction()\n}\n}\n/* \u9012\u5f52 O(n) */\nfunc recur(n: Int) {\nif n == 1 {\nreturn\n}\nrecur(n: n - 1)\n}\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#233","title":"2.3.3. \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u6709\uff08\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\uff09

\\[ \\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} \\]

Fig. \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u89c1\u7c7b\u578b

Tip

\u90e8\u5206\u793a\u4f8b\u4ee3\u7801\u9700\u8981\u4e00\u4e9b\u524d\u7f6e\u77e5\u8bc6\uff0c\u5305\u62ec\u6570\u7ec4\u3001\u94fe\u8868\u3001\u4e8c\u53c9\u6811\u3001\u9012\u5f52\u7b97\u6cd5\u7b49\u3002\u5982\u679c\u9047\u5230\u770b\u4e0d\u61c2\u7684\u5730\u65b9\u65e0\u9700\u62c5\u5fc3\uff0c\u53ef\u4ee5\u5728\u5b66\u4e60\u5b8c\u540e\u9762\u7ae0\u8282\u540e\u518d\u6765\u590d\u4e60\uff0c\u73b0\u9636\u6bb5\u6211\u4eec\u5148\u4e13\u6ce8\u4e8e\u7406\u89e3\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u542b\u4e49\u548c\u63a8\u7b97\u65b9\u6cd5\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#o1","title":"\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\u5373\u4e0d\u4f1a\u7d2f\u79ef\u5360\u7528\u7a7a\u95f4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nfinal int a = 0;\nint b = 0;\nint[] nums = new int[10000];\nListNode node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nfunction();\n}\n}\n
space_complexity.cpp
/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst int a = 0;\nint b = 0;\nvector<int> nums(10000);\nListNode node(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n
space_complexity.py
def constant(n: int) -> None:\n\"\"\"\u5e38\u6570\u9636\"\"\"\n# \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\na: int = 0\nnums: list[int] = [0] * 10000\nnode = ListNode(0)\n# \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in range(n):\nc: int = 0\n# \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in range(n):\nfunction()\n
space_complexity.go
/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a = 0\nb := 0\nnums := make([]int, 10000)\nListNode := newNode(0)\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nvar c int\nfor i := 0; i < n; i++ {\nc = 0\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor i := 0; i < n; i++ {\nfunction()\n}\nfmt.Println(a, b, nums, c, ListNode)\n}\n
space_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a = 0;\nconst b = 0;\nconst nums = new Array(10000);\nconst node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconst c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n
space_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a = 0;\nconst b = 0;\nconst nums = new Array(10000);\nconst node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconst c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (let i = 0; i < n; i++) {\nconstFunc();\n}\n}\n
space_complexity.c
/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst int a = 0;\nint b = 0;\nint nums[1000];\nListNode *node = newListNode(0);\nfree(node);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++) {\nfunc();\n}\n}\n
space_complexity.cs
/* \u5e38\u6570\u9636 */\nvoid constant(int n)\n{\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nint a = 0;\nint b = 0;\nint[] nums = new int[10000];\nListNode node = new ListNode(0);\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++)\n{\nint c = 0;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor (int i = 0; i < n; i++)\n{\nfunction();\n}\n}\n
space_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nlet a = 0\nvar b = 0\nlet nums = Array(repeating: 0, count: 10000)\nlet node = ListNode(x: 0)\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in 0 ..< n {\nlet c = 0\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in 0 ..< n {\nfunction()\n}\n}\n
space_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n// \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\nconst a: i32 = 0;\nvar b: i32 = 0;\nvar nums = [_]i32{0}**10000;\nvar node = inc.ListNode(i32){.val = 0};\nvar i: i32 = 0;\n// \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nwhile (i < n) : (i += 1) {\nvar c: i32 = 0;\n_ = c;\n}\n// \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\ni = 0;\nwhile (i < n) : (i += 1) {\n_ = function();\n}\n_ = a;\n_ = b;\n_ = nums;\n_ = node;\n}\n
"},{"location":"chapter_computational_complexity/space_complexity/#on","title":"\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n// \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\nint[] nums = new int[n];\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nList<ListNode> nodes = new ArrayList<>();\nfor (int i = 0; i < n; i++) {\nnodes.add(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nMap<Integer, String> map = new HashMap<>();\nfor (int i = 0; i < n; i++) {\nmap.put(i, String.valueOf(i));\n}\n}\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\nvector<int> nums(n);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nvector<ListNode> nodes;\nfor (int i = 0; i < n; i++) {\nnodes.push_back(ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nunordered_map<int, string> map;\nfor (int i = 0; i < n; i++) {\nmap[i] = to_string(i);\n}\n}\n
space_complexity.py
def linear(n: int) -> None:\n\"\"\"\u7ebf\u6027\u9636\"\"\"\n# \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nnums: list[int] = [0] * n\n# \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nmapp = dict[int, str]()\nfor i in range(n):\nmapp[i] = str(i)\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\nvar nodes []*node\nfor i := 0; i < n; i++ {\nnodes = append(nodes, newNode(i))\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nm := make(map[int]string, n)\nfor i := 0; i < n; i++ {\nm[i] = strconv.Itoa(i)\n}\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\nconst nums = new Array(n);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst nodes = [];\nfor (let i = 0; i < n; i++) {\nnodes.push(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst map = new Map();\nfor (let i = 0; i < n; i++) {\nmap.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\nconst nums = new Array(n);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst nodes: ListNode[] = [];\nfor (let i = 0; i < n; i++) {\nnodes.push(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nconst map = new Map();\nfor (let i = 0; i < n; i++) {\nmap.set(i, i.toString());\n}\n}\n
space_complexity.c
/* \u54c8\u5e0c\u8868 */\nstruct hashTable {\nint key;\nint val;\nUT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n};\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n// \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\nint *nums = malloc(sizeof(int) * n);\nfree(nums);\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nListNode **nodes = malloc(sizeof(ListNode *) * n);\nfor (int i = 0; i < n; i++) {\nnodes[i] = newListNode(i);\n}\n// \u5185\u5b58\u91ca\u653e\nfor (int i = 0; i < n; i++) {\nfree(nodes[i]);\n}\nfree(nodes);\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nhashTable *h = NULL;\nfor (int i = 0; i < n; i++) {\nhashTable *tmp = malloc(sizeof(hashTable));\ntmp->key = i;\ntmp->val = i;\nHASH_ADD_INT(h, key, tmp);\n}\n// \u5185\u5b58\u91ca\u653e\nhashTable *curr, *tmp;\nHASH_ITER(hh, h, curr, tmp) {\nHASH_DEL(h, curr);\nfree(curr);\n}\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636 */\nvoid linear(int n)\n{\n// \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\nint[] nums = new int[n];\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nList<ListNode> nodes = new();\nfor (int i = 0; i < n; i++)\n{\nnodes.Add(new ListNode(i));\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nDictionary<int, String> map = new();\nfor (int i = 0; i < n; i++)\n{\nmap.Add(i, i.ToString());\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\nlet nums = Array(repeating: 0, count: n)\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nlet nodes = (0 ..< n).map { ListNode(x: $0) }\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nlet map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\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\nvar nums = [_]i32{0}**n;\n// \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nvar nodes = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nodes.deinit();\nvar i: i32 = 0;\nwhile (i < n) : (i += 1) {\ntry nodes.append(i);\n}\n// \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\nvar map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\ndefer map.deinit();\nvar j: i32 = 0;\nwhile (j < n) : (j += 1) {\nconst string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\ndefer std.heap.page_allocator.free(string);\ntry map.put(i, string);\n}\n_ = nums;\n}\n

\u4ee5\u4e0b\u9012\u5f52\u51fd\u6570\u4f1a\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 algorithm() \u51fd\u6570\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\nSystem.out.println(\"\u9012\u5f52 n = \" + n);\nif (n == 1)\nreturn;\nlinearRecur(n - 1);\n}\n
space_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\ncout << \"\u9012\u5f52 n = \" << n << endl;\nif (n == 1)\nreturn;\nlinearRecur(n - 1);\n}\n
space_complexity.py
def linear_recur(n: int) -> None:\n\"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nprint(\"\u9012\u5f52 n =\", n)\nif n == 1:\nreturn\nlinear_recur(n - 1)\n
space_complexity.go
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\nfmt.Println(\"\u9012\u5f52 n =\", n)\nif n == 1 {\nreturn\n}\nspaceLinearRecur(n - 1)\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\nconsole.log(`\u9012\u5f52 n = ${n}`);\nif (n === 1) return;\nlinearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\nconsole.log(`\u9012\u5f52 n = ${n}`);\nif (n === 1) return;\nlinearRecur(n - 1);\n}\n
space_complexity.c
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\nprintf(\"\u9012\u5f52 n = %d\\r\\n\", n);\nif (n == 1)\nreturn;\nlinearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n)\n{\nConsole.WriteLine(\"\u9012\u5f52 n = \" + n);\nif (n == 1) return;\nlinearRecur(n - 1);\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\nprint(\"\u9012\u5f52 n = \\(n)\")\nif n == 1 {\nreturn\n}\nlinearRecur(n: n - 1)\n}\n
space_complexity.zig
// \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\nstd.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\nif (n == 1) return;\nlinearRecur(n - 1);\n}\n

Fig. \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u7ebf\u6027\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#on2","title":"\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nint[][] numMatrix = new int[n][n];\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nList<List<Integer>> numList = new ArrayList<>();\nfor (int i = 0; i < n; i++) {\nList<Integer> tmp = new ArrayList<>();\nfor (int j = 0; j < n; j++) {\ntmp.add(0);\n}\nnumList.add(tmp);\n}\n}\n
space_complexity.cpp
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nvector<vector<int>> numMatrix;\nfor (int i = 0; i < n; i++) {\nvector<int> tmp;\nfor (int j = 0; j < n; j++) {\ntmp.push_back(0);\n}\nnumMatrix.push_back(tmp);\n}\n}\n
space_complexity.py
def quadratic(n: int) -> None:\n\"\"\"\u5e73\u65b9\u9636\"\"\"\n# \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nnum_matrix: list[list[int]] = [[0] * n for _ in range(n)]\n
space_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nnumMatrix := make([][]int, n)\nfor i := 0; i < n; i++ {\nnumMatrix[i] = make([]int, n)\n}\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nconst numMatrix = Array(n)\n.fill(null)\n.map(() => Array(n).fill(null));\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nconst numList = [];\nfor (let i = 0; i < n; i++) {\nconst tmp = [];\nfor (let j = 0; j < n; j++) {\ntmp.push(0);\n}\nnumList.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\nconst numMatrix = Array(n)\n.fill(null)\n.map(() => Array(n).fill(null));\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nconst numList = [];\nfor (let i = 0; i < n; i++) {\nconst tmp = [];\nfor (let j = 0; j < n; j++) {\ntmp.push(0);\n}\nnumList.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\nint **numMatrix = malloc(sizeof(int *) * n);\nfor (int i = 0; i < n; i++) {\nint *tmp = malloc(sizeof(int) * n);\nfor (int j = 0; j < n; j++) {\ntmp[j] = 0;\n}\nnumMatrix[i] = tmp;\n}\n// \u5185\u5b58\u91ca\u653e\nfor (int i = 0; i < n; i++) {\nfree(numMatrix[i]);\n}\nfree(numMatrix);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n)\n{\n// \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\nint[,] numMatrix = new int[n, n];\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nList<List<int>> numList = new();\nfor (int i = 0; i < n; i++)\n{\nList<int> tmp = new();\nfor (int j = 0; j < n; j++)\n{\ntmp.Add(0);\n}\nnumList.Add(tmp);\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\nlet numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n// \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\nvar nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\ndefer nodes.deinit();\nvar i: i32 = 0;\nwhile (i < n) : (i += 1) {\nvar tmp = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer tmp.deinit();\nvar j: i32 = 0;\nwhile (j < n) : (j += 1) {\ntry tmp.append(0);\n}\ntry nodes.append(tmp);\n}\n}\n

\u5728\u4ee5\u4e0b\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 algorithm() \uff0c\u5e76\u4e14\u6bcf\u4e2a\u51fd\u6570\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u957f\u5ea6\u5206\u522b\u4e3a \\(n, n-1, n-2, ..., 2, 1\\) \uff0c\u5e73\u5747\u957f\u5ea6\u4e3a \\(\\frac{n}{2}\\) \uff0c\u56e0\u6b64\u603b\u4f53\u5360\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\nif (n <= 0)\nreturn 0;\n// \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\nint[] nums = new int[n];\nSystem.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\nif (n <= 0)\nreturn 0;\nvector<int> nums(n);\ncout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.py
def quadratic_recur(n: int) -> int:\n\"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n <= 0:\nreturn 0\n# \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\nnums: list[int] = [0] * n\nreturn quadratic_recur(n - 1)\n
space_complexity.go
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\nif n <= 0 {\nreturn 0\n}\nnums := make([]int, n)\nfmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\nreturn spaceQuadraticRecur(n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\nif (n <= 0) return 0;\nconst nums = new Array(n);\nconsole.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\nif (n <= 0) return 0;\nconst nums = new Array(n);\nconsole.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\nif (n <= 0)\nreturn 0;\nint *nums = malloc(sizeof(int) * n);\nprintf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\nfree(nums);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n)\n{\nif (n <= 0) return 0;\nint[] nums = new int[n];\nConsole.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\nreturn quadraticRecur(n - 1);\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\nif n <= 0 {\nreturn 0\n}\n// \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\nlet nums = Array(repeating: 0, count: n)\nprint(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\nreturn quadraticRecur(n: n - 1)\n}\n
space_complexity.zig
// \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\nif (n <= 0) return 0;\nvar nums = [_]i32{0}**n;\nstd.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\nreturn quadraticRecur(n - 1);\n}\n

Fig. \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u5e73\u65b9\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#o2n","title":"\u6307\u6570\u9636 \\(O(2^n)\\)","text":"

\u6307\u6570\u9636\u5e38\u89c1\u4e8e\u4e8c\u53c9\u6811\u3002\u9ad8\u5ea6\u4e3a \\(n\\) \u7684\u300c\u6ee1\u4e8c\u53c9\u6811\u300d\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(2^n - 1\\) \uff0c\u5360\u7528 \\(O(2^n)\\) \u7a7a\u95f4\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig space_complexity.java
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\nif (n == 0)\nreturn null;\nTreeNode root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\nif (n == 0)\nreturn nullptr;\nTreeNode *root = new TreeNode(0);\nroot->left = buildTree(n - 1);\nroot->right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n\"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\nif n == 0:\nreturn None\nroot = TreeNode(0)\nroot.left = build_tree(n - 1)\nroot.right = build_tree(n - 1)\nreturn root\n
space_complexity.go
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *treeNode {\nif n == 0 {\nreturn nil\n}\nroot := newTreeNode(0)\nroot.left = buildTree(n - 1)\nroot.right = buildTree(n - 1)\nreturn root\n}\n
space_complexity.js
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\nif (n === 0) return null;\nconst root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.ts
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\nif (n === 0) return null;\nconst root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.c
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\nif (n == 0)\nreturn NULL;\nTreeNode *root = newTreeNode(0);\nroot->left = buildTree(n - 1);\nroot->right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.cs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n)\n{\nif (n == 0) return null;\nTreeNode root = new TreeNode(0);\nroot.left = buildTree(n - 1);\nroot.right = buildTree(n - 1);\nreturn root;\n}\n
space_complexity.swift
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\nif n == 0 {\nreturn nil\n}\nlet root = TreeNode(x: 0)\nroot.left = buildTree(n: n - 1)\nroot.right = buildTree(n: n - 1)\nreturn root\n}\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) {\nif (n == 0) return null;\nconst root = try mem_allocator.create(inc.TreeNode(i32));\nroot.init(0);\nroot.left = try buildTree(mem_allocator, n - 1);\nroot.right = try buildTree(mem_allocator, n - 1);\nreturn root;\n}\n

Fig. \u6ee1\u4e8c\u53c9\u6811\u4ea7\u751f\u7684\u6307\u6570\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#olog-n","title":"\u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

\u5bf9\u6570\u9636\u5e38\u89c1\u4e8e\u5206\u6cbb\u7b97\u6cd5\u548c\u6570\u636e\u7c7b\u578b\u8f6c\u6362\u7b49\u3002

\u4f8b\u5982\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u7b97\u6cd5\uff0c\u8f93\u5165\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u6bcf\u8f6e\u9012\u5f52\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\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\u201c\u6570\u5b57\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\u201d\uff0c\u8f93\u5165\u4efb\u610f\u6b63\u6574\u6570 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6570\u4e3a \\(\\log_{10} n\\) \uff0c\u5373\u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a \\(\\log_{10} n\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_{10} n) = O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/space_complexity/#234","title":"2.3.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\u662f\u975e\u5e38\u56f0\u96be\u7684\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\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\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\u662f\u975e\u5e38\u91cd\u8981\u7684\u3002

"},{"location":"chapter_computational_complexity/summary/","title":"2.4. \u00a0 \u5c0f\u7ed3","text":"

\u7b97\u6cd5\u6548\u7387\u8bc4\u4f30

  • \u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u8bc4\u4ef7\u7b97\u6cd5\u6027\u80fd\u7684\u4e24\u4e2a\u5173\u952e\u7ef4\u5ea6\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\u514b\u670d\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\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\u5373\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u5f53 \\(n\\) \u8d8b\u5411\u6b63\u65e0\u7a77\u65f6\uff0c\\(T(n)\\) \u7684\u589e\u957f\u7ea7\u522b\u3002
  • \u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u4e24\u6b65\uff0c\u9996\u5148\u7edf\u8ba1\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002
  • \u5e38\u89c1\u65f6\u95f4\u590d\u6742\u5ea6\u4ece\u5c0f\u5230\u5927\u6392\u5217\u6709 \\(O(1)\\) , \\(O(\\log n)\\) , \\(O(n)\\) , \\(O(n \\log n)\\) , \\(O(n^2)\\) , \\(O(2^n)\\) , \\(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

  • \u7c7b\u4f3c\u4e8e\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\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\u8ba1\u5165\u7a7a\u95f4\u590d\u6742\u5ea6\u8ba1\u7b97\u3002\u6682\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u6307\u4ee4\u7a7a\u95f4\u3001\u6570\u636e\u7a7a\u95f4\u3001\u6808\u5e27\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\u95f4\u70b9\u4e0b\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u5e38\u89c1\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece\u5c0f\u5230\u5927\u6392\u5217\u6709 \\(O(1)\\) , \\(O(\\log n)\\) , \\(O(n)\\) , \\(O(n^2)\\) , \\(O(2^n)\\) \u7b49\u3002
"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.2. \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6","text":""},{"location":"chapter_computational_complexity/time_complexity/#221","title":"2.2.1. \u00a0 \u7edf\u8ba1\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4","text":"

\u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u76f4\u89c2\u4e14\u51c6\u786e\u5730\u53cd\u6620\u7b97\u6cd5\u7684\u6548\u7387\u3002\u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\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\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\u4ee5\u4e0b\u4ee3\u7801\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u6839\u636e\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u4e3a \\(6n + 12\\) ns \u3002

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\] JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nSystem.out.println(0);     // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\ncout << 0 << endl;         // 5 ns\n}\n}\n
# \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n: int) -> None:\na = 2      # 1 ns\na = a + 1  # 1 ns\na = a * 2  # 10 ns\n# \u5faa\u73af n \u6b21\nfor _ in range(n):  # 1 ns\nprint(0)        # 5 ns\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n int) {\na := 2      // 1 ns\na = a + 1   // 1 ns\na = a * 2   // 10 ns\n// \u5faa\u73af n \u6b21\nfor i := 0; i < n; i++ {    // 1 ns\nfmt.Println(a)          // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n) {\nvar a = 2; // 1 ns\na = a + 1; // 1 ns\na = a * 2; // 10 ns\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nconsole.log(0); // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n: number): void {\nvar a: number = 2; // 1 ns\na = a + 1; // 1 ns\na = a * 2; // 10 ns\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nconsole.log(0); // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nprintf(\"%d\", 0);            // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n)\n{\nint a = 2;  // 1 ns\na = a + 1;  // 1 ns\na = a * 2;  // 10 ns\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++)\n{  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\nConsole.WriteLine(0);     // 5 ns\n}\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n: Int) {\nvar a = 2 // 1 ns\na = a + 1 // 1 ns\na = a * 2 // 10 ns\n// \u5faa\u73af n \u6b21\nfor _ in 0 ..< n { // 1 ns\nprint(0) // 5 ns\n}\n}\n
\n

\u7136\u800c\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\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/#222","title":"2.2.2. \u00a0 \u7edf\u8ba1\u65f6\u95f4\u589e\u957f\u8d8b\u52bf","text":"

\u300c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u300d\u91c7\u53d6\u4e86\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u5176\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\u8f83\u4e3a\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 , B , C \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\u300c\u5e38\u6570\u9636\u300d\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\u300c\u7ebf\u6027\u9636\u300d\u3002
  • \u7b97\u6cd5 C \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(1000000\\) \u6b21\uff0c\u4f46\u8fd0\u884c\u65f6\u95f4\u4ecd\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\u300c\u5e38\u6570\u9636\u300d\u3002
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\nSystem.out.println(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\nfor (int i = 0; i < n; i++) {\nSystem.out.println(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\nfor (int i = 0; i < 1000000; i++) {\nSystem.out.println(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\ncout << 0 << endl;\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\nfor (int i = 0; i < n; i++) {\ncout << 0 << endl;\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\nfor (int i = 0; i < 1000000; i++) {\ncout << 0 << endl;\n}\n}\n
# \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n: int) -> None:\nprint(0)\n# \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n: int) -> None:\nfor _ in range(n):\nprint(0)\n# \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n: int) -> None:\nfor _ in range(1000000):\nprint(0)\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_A(n int) {\nfmt.Println(0)\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithm_B(n int) {\nfor i := 0; i < n; i++ {\nfmt.Println(0)\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_C(n int) {\nfor i := 0; i < 1000000; i++ {\nfmt.Println(0)\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n) {\nconsole.log(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n) {\nfor (let i = 0; i < n; i++) {\nconsole.log(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n) {\nfor (let i = 0; i < 1000000; i++) {\nconsole.log(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n: number): void {\nconsole.log(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n: number): void {\nfor (let i = 0; i < n; i++) {\nconsole.log(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n: number): void {\nfor (let i = 0; i < 1000000; i++) {\nconsole.log(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\nprintf(\"%d\", 0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\nfor (int i = 0; i < n; i++) {\nprintf(\"%d\", 0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\nfor (int i = 0; i < 1000000; i++) {\nprintf(\"%d\", 0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n)\n{\nConsole.WriteLine(0);\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n)\n{\nfor (int i = 0; i < n; i++)\n{\nConsole.WriteLine(0);\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n)\n{\nfor (int i = 0; i < 1000000; i++)\n{\nConsole.WriteLine(0);\n}\n}\n
// \u7b97\u6cd5 A \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmA(n: Int) {\nprint(0)\n}\n// \u7b97\u6cd5 B \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithmB(n: Int) {\nfor _ in 0 ..< n {\nprint(0)\n}\n}\n// \u7b97\u6cd5 C \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmC(n: Int) {\nfor _ in 0 ..< 1000000 {\nprint(0)\n}\n}\n
\n

Fig. \u7b97\u6cd5 A, B, C \u7684\u65f6\u95f4\u589e\u957f\u8d8b\u52bf

\u76f8\u8f83\u4e8e\u76f4\u63a5\u7edf\u8ba1\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u4f18\u52bf\u548c\u5c40\u9650\u6027\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 \u6162\uff0c\u5728 \\(n > 1000000\\) \u65f6\u6bd4\u7b97\u6cd5 C \u6162\u3002\u4e8b\u5b9e\u4e0a\uff0c\u53ea\u8981\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8db3\u591f\u5927\uff0c\u590d\u6742\u5ea6\u4e3a\u300c\u5e38\u6570\u9636\u300d\u7684\u7b97\u6cd5\u4e00\u5b9a\u4f18\u4e8e\u300c\u7ebf\u6027\u9636\u300d\u7684\u7b97\u6cd5\uff0c\u8fd9\u6b63\u662f\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u6240\u8868\u8fbe\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\u7684\u8fd0\u884c\u65f6\u95f4\u7684\u7edf\u8ba1\u201d\u7b80\u5316\u4e3a\u201c\u8ba1\u7b97\u64cd\u4f5c\u7684\u6570\u91cf\u7684\u7edf\u8ba1\u201d\uff0c\u8fd9\u6837\u7684\u7b80\u5316\u65b9\u6cd5\u5927\u5927\u964d\u4f4e\u4e86\u4f30\u7b97\u96be\u5ea6\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\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/#223","title":"2.2.3. \u00a0 \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c","text":"

\u8bbe\u7b97\u6cd5\u7684\u8ba1\u7b97\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\u4e0b\u7b97\u6cd5\u7684\u64cd\u4f5c\u6570\u91cf\u4e3a

\\[ T(n) = 3 + 2n \\] JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
void algorithm(int n) {\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nSystem.out.println(0);    // +1\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\ncout << 0 << endl;    // +1\n}\n}\n
def algorithm(n: int) -> None:\na: int = 1  # +1\na = a + 1  # +1\na = a * 2  # +1\n# \u5faa\u73af n \u6b21\nfor i in range(n):  # +1\nprint(0)        # +1\n
func algorithm(n int) {\na := 1      // +1\na = a + 1   // +1\na = a * 2   // +1\n// \u5faa\u73af n \u6b21\nfor i := 0; i < n; i++ {   // +1\nfmt.Println(a)         // +1\n}\n}\n
function algorithm(n) {\nvar a = 1; // +1\na += 1; // +1\na *= 2; // +1\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nconsole.log(0); // +1\n}\n}\n
function algorithm(n: number): void{\nvar a: number = 1; // +1\na += 1; // +1\na *= 2; // +1\n// \u5faa\u73af n \u6b21\nfor(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nconsole.log(0); // +1\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\nprintf(\"%d\", 0);            // +1\n}\n}  
void algorithm(int n)\n{\nint a = 1;  // +1\na = a + 1;  // +1\na = a * 2;  // +1\n// \u5faa\u73af n \u6b21\nfor (int i = 0; i < n; i++) // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n{\nConsole.WriteLine(0);   // +1\n}\n}\n
func algorithm(n: Int) {\nvar a = 1 // +1\na = a + 1 // +1\na = a * 2 // +1\n// \u5faa\u73af n \u6b21\nfor _ in 0 ..< n { // +1\nprint(0) // +1\n}\n}\n
\n

\\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u6570\uff0c\u8bf4\u660e\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u662f\u7ebf\u6027\u7684\uff0c\u56e0\u6b64\u53ef\u4ee5\u5f97\u51fa\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\u300c\u5927 \\(O\\) \u8bb0\u53f7 Big-\\(O\\) Notation\u300d\uff0c\u8868\u793a\u51fd\u6570 \\(T(n)\\) \u7684\u300c\u6e10\u8fd1\u4e0a\u754c Asymptotic Upper Bound\u300d\u3002

\u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u672c\u8d28\u4e0a\u662f\u8ba1\u7b97\u201c\u64cd\u4f5c\u6570\u91cf\u51fd\u6570 \\(T(n)\\)\u201d\u7684\u6e10\u8fd1\u4e0a\u754c\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u6765\u770b\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\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) $$ \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)) $$

Fig. \u51fd\u6570\u7684\u6e10\u8fd1\u4e0a\u754c

\u4ece\u672c\u8d28\u4e0a\u8bb2\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

"},{"location":"chapter_computational_complexity/time_complexity/#224","title":"2.2.4. \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\u9700\u62c5\u5fc3\u3002\u56e0\u4e3a\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u6570\u5b66\u610f\u4e49\u53ef\u4ee5\u9010\u6e10\u9886\u609f\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) \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\u88ab\u5ffd\u7565\u3002\u6839\u636e\u6b64\u539f\u5219\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u8ba1\u6570\u7b80\u5316\u6280\u5de7\uff1a

  1. \u5ffd\u7565\u4e0e \\(n\\) \u65e0\u5173\u7684\u64cd\u4f5c\u3002\u56e0\u4e3a\u5b83\u4eec\u90fd\u662f \\(T(n)\\) \u4e2d\u7684\u5e38\u6570\u9879\uff0c\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\u4e0a\u8ff0 1. \u548c 2. \u6280\u5de7\u3002

\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u3001\u540e\u7684\u7edf\u8ba1\u7ed3\u679c\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} \\]

\u6700\u7ec8\uff0c\u4e24\u8005\u90fd\u80fd\u63a8\u51fa\u76f8\u540c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7ed3\u679c\uff0c\u5373 \\(O(n^2)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
void algorithm(int n) {\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++) {\nSystem.out.println(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++) {\nfor (int j = 0; j < n + 1; j++) {\nSystem.out.println(0);\n}\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++) {\ncout << 0 << endl;\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++) {\nfor (int j = 0; j < n + 1; j++) {\ncout << 0 << endl;\n}\n}\n}\n
def algorithm(n: int) -> None:\na: int = 1  # +0\uff08\u6280\u5de7 1\uff09\na = a + n   # +0\uff08\u6280\u5de7 1\uff09\n# +n\uff08\u6280\u5de7 2\uff09\nfor i in range(5 * n + 1):\nprint(0)\n# +n*n\uff08\u6280\u5de7 3\uff09\nfor i in range(2 * n):\nfor j in range(n + 1):\nprint(0)\n
func algorithm(n int) {\na := 1      // +0\uff08\u6280\u5de7 1\uff09\na = a + n  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor i := 0; i < 5 * n + 1; i++ {\nfmt.Println(0)\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor i := 0; i < 2 * n; i++ {\nfor j := 0; j < n + 1; j++ {\nfmt.Println(0)\n}\n}\n}\n
function algorithm(n) {\nlet a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (let i = 0; i < 5 * n + 1; i++) {\nconsole.log(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (let i = 0; i < 2 * n; i++) {\nfor (let j = 0; j < n + 1; j++) {\nconsole.log(0);\n}\n}\n}\n
function algorithm(n: number): void {\nlet a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (let i = 0; i < 5 * n + 1; i++) {\nconsole.log(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (let i = 0; i < 2 * n; i++) {\nfor (let j = 0; j < n + 1; j++) {\nconsole.log(0);\n}\n}\n}\n
void algorithm(int n) {\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++) {\nprintf(\"%d\", 0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++) {\nfor (int j = 0; j < n + 1; j++) {\nprintf(\"%d\", 0);\n}\n}\n}\n
void algorithm(int n)\n{\nint a = 1;  // +0\uff08\u6280\u5de7 1\uff09\na = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor (int i = 0; i < 5 * n + 1; i++)\n{\nConsole.WriteLine(0);\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor (int i = 0; i < 2 * n; i++)\n{\nfor (int j = 0; j < n + 1; j++)\n{\nConsole.WriteLine(0);\n}\n}\n}\n
func algorithm(n: Int) {\nvar a = 1 // +0\uff08\u6280\u5de7 1\uff09\na = a + n // +0\uff08\u6280\u5de7 1\uff09\n// +n\uff08\u6280\u5de7 2\uff09\nfor _ in 0 ..< (5 * n + 1) {\nprint(0)\n}\n// +n*n\uff08\u6280\u5de7 3\uff09\nfor _ in 0 ..< (2 * n) {\nfor _ in 0 ..< (n + 1) {\nprint(0)\n}\n}\n}\n
\n
"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2) \u5224\u65ad\u6e10\u8fd1\u4e0a\u754c","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\u7531\u591a\u9879\u5f0f \\(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\u88ab\u5ffd\u7565\u3002

\u4ee5\u4e0b\u8868\u683c\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

\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/#225","title":"2.2.5. \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\u5305\u62ec\uff08\u6309\u7167\u4ece\u4f4e\u5230\u9ad8\u7684\u987a\u5e8f\u6392\u5217\uff09\uff1a

\\[ \\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} \\]

Fig. \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u89c1\u7c7b\u578b

Tip

\u90e8\u5206\u793a\u4f8b\u4ee3\u7801\u9700\u8981\u4e00\u4e9b\u9884\u5907\u77e5\u8bc6\uff0c\u5305\u62ec\u6570\u7ec4\u3001\u9012\u5f52\u7b97\u6cd5\u7b49\u3002\u5982\u679c\u9047\u5230\u4e0d\u7406\u89e3\u7684\u90e8\u5206\uff0c\u8bf7\u4e0d\u8981\u62c5\u5fc3\uff0c\u53ef\u4ee5\u5728\u5b66\u4e60\u5b8c\u540e\u9762\u7ae0\u8282\u540e\u518d\u56de\u987e\u3002\u73b0\u9636\u6bb5\uff0c\u8bf7\u5148\u4e13\u6ce8\u4e8e\u7406\u89e3\u65f6\u95f4\u590d\u6742\u5ea6\u7684\u542b\u4e49\u548c\u63a8\u7b97\u65b9\u6cd5\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#o1","title":"\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

\u5bf9\u4e8e\u4ee5\u4e0b\u7b97\u6cd5\uff0c\u5c3d\u7ba1\u64cd\u4f5c\u6570\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u4e8e\u5176\u4e0e\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5e38\u6570\u9636 */\nint constant(int n) {\nint count = 0;\nint size = 100000;\nfor (int i = 0; i < size; i++)\ncount++;\nreturn count;\n}\n
time_complexity.cpp
/* \u5e38\u6570\u9636 */\nint constant(int n) {\nint count = 0;\nint size = 100000;\nfor (int i = 0; i < size; i++)\ncount++;\nreturn count;\n}\n
time_complexity.py
def constant(n: int) -> int:\n\"\"\"\u5e38\u6570\u9636\"\"\"\ncount: int = 0\nsize: int = 100000\nfor _ in range(size):\ncount += 1\nreturn count\n
time_complexity.go
/* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\ncount := 0\nsize := 100000\nfor i := 0; i < size; i++ {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\nlet count = 0;\nconst size = 100000;\nfor (let i = 0; i < size; i++) count++;\nreturn count;\n}\n
time_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\nlet count = 0;\nconst size = 100000;\nfor (let i = 0; i < size; i++) count++;\nreturn count;\n}\n
time_complexity.c
/* \u5e38\u6570\u9636 */\nint constant(int n) {\nint count = 0;\nint size = 100000;\nint i = 0;\nfor (int i = 0; i < size; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5e38\u6570\u9636 */\nint constant(int n)\n{\nint count = 0;\nint size = 100000;\nfor (int i = 0; i < size; i++)\ncount++;\nreturn count;\n}\n
time_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\nvar count = 0\nlet size = 100_000\nfor _ in 0 ..< size {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n_ = n;\nvar count: i32 = 0;\nconst size: i32 = 100_000;\nvar i: i32 = 0;\nwhile(i<size) : (i += 1) {\ncount += 1;\n}\nreturn count;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#on","title":"\u7ebf\u6027\u9636 \\(O(n)\\)","text":"

\u7ebf\u6027\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4ee5\u7ebf\u6027\u7ea7\u522b\u589e\u957f\u3002\u7ebf\u6027\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5355\u5c42\u5faa\u73af\u4e2d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\nint count = 0;\nfor (int i = 0; i < n; i++)\ncount++;\nreturn count;\n}\n
time_complexity.cpp
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\nint count = 0;\nfor (int i = 0; i < n; i++)\ncount++;\nreturn count;\n}\n
time_complexity.py
def linear(n: int) -> int:\n\"\"\"\u7ebf\u6027\u9636\"\"\"\ncount: int = 0\nfor _ in range(n):\ncount += 1\nreturn count\n
time_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\ncount := 0\nfor i := 0; i < n; i++ {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\nlet count = 0;\nfor (let i = 0; i < n; i++) count++;\nreturn count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\nlet count = 0;\nfor (let i = 0; i < n; i++) count++;\nreturn count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\nint count = 0;\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636 */\nint linear(int n)\n{\nint count = 0;\nfor (int i = 0; i < n; i++)\ncount++;\nreturn count;\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\nvar count = 0\nfor _ in 0 ..< n {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < n) : (i += 1) {\ncount += 1;\n}\nreturn count;\n}\n

\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\u3002

\u5982\u4f55\u786e\u5b9a\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \uff1f

\u6570\u636e\u5927\u5c0f \\(n\\) \u9700\u6839\u636e\u8f93\u5165\u6570\u636e\u7684\u7c7b\u578b\u6765\u5177\u4f53\u786e\u5b9a\u3002\u4f8b\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u76f4\u63a5\u5c06 \\(n\\) \u89c6\u4e3a\u8f93\u5165\u6570\u636e\u5927\u5c0f\uff1b\u5728\u4e0b\u9762\u904d\u5386\u6570\u7ec4\u7684\u793a\u4f8b\u4e2d\uff0c\u6570\u636e\u5927\u5c0f \\(n\\) \u4e3a\u6570\u7ec4\u7684\u957f\u5ea6\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (int num : nums) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (int num : nums) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.py
def array_traversal(nums: list[int]) -> int:\n\"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\ncount: int = 0\n# \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor num in nums:\ncount += 1\nreturn count\n
time_complexity.go
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\ncount := 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor range nums {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (let i = 0; i < nums.length; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums)\n{\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nforeach (int num in nums)\n{\ncount++;\n}\nreturn count;\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\nvar count = 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor _ in nums {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\nvar count: i32 = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nfor (nums) |_| {\ncount += 1;\n}\nreturn count;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#on2","title":"\u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

\u5e73\u65b9\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f\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\u90fd\u4e3a \\(O(n)\\) \uff0c\u56e0\u6b64\u603b\u4f53\u4e3a \\(O(n^2)\\) \u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.py
def quadratic(n: int) -> int:\n\"\"\"\u5e73\u65b9\u9636\"\"\"\ncount: int = 0\n# \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor i in range(n):\nfor j in range(n):\ncount += 1\nreturn count\n
time_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\ncount := 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor i := 0; i < n; i++ {\nfor j := 0; j < n; j++ {\ncount++\n}\n}\nreturn count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\nlet count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < n; j++) {\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636 */\nint quadratic(int n)\n{\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor (int i = 0; i < n; i++)\n{\nfor (int j = 0; j < n; j++)\n{\ncount++;\n}\n}\nreturn count;\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\nvar count = 0\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nfor _ in 0 ..< n {\nfor _ in 0 ..< n {\ncount += 1\n}\n}\nreturn count\n}\n
time_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\nvar count: i32 = 0;\nvar i: i32 = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u5e73\u65b9\u5173\u7cfb\nwhile (i < n) : (i += 1) {\nvar j: i32 = 0;\nwhile (j < n) : (j += 1) {\ncount += 1;\n}\n}\nreturn count;\n}\n

Fig. \u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u3001\u5e73\u65b9\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4ee5\u300c\u5192\u6ce1\u6392\u5e8f\u300d\u4e3a\u4f8b\uff0c\u5916\u5c42\u5faa\u73af\u6267\u884c \\(n - 1\\) \u6b21\uff0c\u5185\u5c42\u5faa\u73af\u6267\u884c \\(n-1, n-2, \\cdots, 2, 1\\) \u6b21\uff0c\u5e73\u5747\u4e3a \\(\\frac{n}{2}\\) \u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

\\[ O((n - 1) \\frac{n}{2}) = O(n^2) \\] JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\nint count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\nint count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n\"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\ncount: int = 0  # \u8ba1\u6570\u5668\n# \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in range(len(nums) - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in range(i):\nif nums[j] > nums[j + 1]:\n# \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\ntmp: int = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\ncount += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\nreturn count\n
time_complexity.go
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\ncount := 0 // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j := 0; j < i; j++ {\nif nums[j] > nums[j+1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\ntmp := nums[j]\nnums[j] = nums[j+1]\nnums[j+1] = tmp\ncount += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\nlet count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\nlet count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\nint count = 0; // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = n - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums)\n{\nint count = 0;  // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.Length - 1; i > 0; i--)\n{\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++)\n{\nif (nums[j] > nums[j + 1])\n{\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\nvar count = 0 // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in 0 ..< i {\nif nums[j] > nums[j + 1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\ncount += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count\n}\n
time_complexity.zig
// \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\nvar count: i32 = 0;  // \u8ba1\u6570\u5668 \n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nvar i: i32 = @intCast(i32, nums.len ) - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nwhile (j < i) : (j += 1) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nvar tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\ncount += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n}\n}\n}\nreturn count;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#o2n","title":"\u6307\u6570\u9636 \\(O(2^n)\\)","text":"

Note

\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

\u6307\u6570\u9636\u589e\u957f\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u901a\u5e38\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002\u82e5\u4e00\u4e2a\u95ee\u9898\u4f7f\u7528\u300c\u66b4\u529b\u679a\u4e3e\u300d\u6c42\u89e3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u4f7f\u7528\u300c\u52a8\u6001\u89c4\u5212\u300d\u6216\u300c\u8d2a\u5fc3\u7b97\u6cd5\u300d\u7b49\u65b9\u6cd5\u6765\u89e3\u51b3\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\nint count = 0, base = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\nint count = 0, base = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.py
def exponential(n: int) -> int:\n\"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\ncount: int = 0\nbase: int = 1\n# cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor _ in range(n):\nfor _ in range(base):\ncount += 1\nbase *= 2\n# count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\ncount, base := 0, 1\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor i := 0; i < n; i++ {\nfor j := 0; j < base; j++ {\ncount++\n}\nbase *= 2\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\nlet count = 0,\nbase = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\nlet count = 0,\nbase = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (let i = 0; i < n; i++) {\nfor (let j = 0; j < base; j++) {\ncount++;\n}\nbase *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\nint count = 0;\nint bas = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++) {\nfor (int j = 0; j < bas; j++) {\ncount++;\n}\nbas *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n)\n{\nint count = 0, bas = 1;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor (int i = 0; i < n; i++)\n{\nfor (int j = 0; j < bas; j++)\n{\ncount++;\n}\nbas *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\nvar count = 0\nvar base = 1\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nfor _ in 0 ..< n {\nfor _ in 0 ..< base {\ncount += 1\n}\nbase *= 2\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count\n}\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\nvar count: i32 = 0;\nvar bas: i32 = 1;\nvar i: i32 = 0;\n// cell \u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\nwhile (i < n) : (i += 1) {\nvar j: i32 = 0;\nwhile (j < bas) : (j += 1) {\ncount += 1;\n}\nbas *= 2;\n}\n// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\nreturn count;\n}\n

Fig. \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\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\uff0c\u4e0d\u65ad\u5730\u4e00\u5206\u4e3a\u4e8c\uff0c\u7ecf\u8fc7 \\(n\\) \u6b21\u5206\u88c2\u540e\u505c\u6b62\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\nif (n == 1)\nreturn 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\nif (n == 1)\nreturn 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.py
def exp_recur(n: int) -> int:\n\"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n == 1:\nreturn 1\nreturn exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\nif n == 1 {\nreturn 1\n}\nreturn expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\nif (n == 1) return 1;\nreturn 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 {\nif (n == 1) return 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\nif (n == 1)\nreturn 1;\nreturn 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{\nif (n == 1) return 1;\nreturn 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 {\nif n == 1 {\nreturn 1\n}\nreturn expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\nif (n == 1) return 1;\nreturn expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#olog-n","title":"\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\u7684\u60c5\u51b5\u201d\u3002\u5bf9\u6570\u9636\u4ec5\u6b21\u4e8e\u5e38\u6570\u9636\uff0c\u65f6\u95f4\u589e\u957f\u7f13\u6162\uff0c\u662f\u7406\u60f3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u300c\u4e8c\u5206\u67e5\u627e\u300d\u548c\u300c\u5206\u6cbb\u7b97\u6cd5\u300d\u4e2d\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u591a\u201d\u548c\u201c\u5316\u7e41\u4e3a\u7b80\u201d\u7684\u7b97\u6cd5\u601d\u60f3\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n) {\nint count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n) {\nint count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.py
def logarithmic(n: float) -> int:\n\"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\ncount: int = 0\nwhile n > 1:\nn = n / 2\ncount += 1\nreturn count\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n float64) int {\ncount := 0\nfor n > 1 {\nn = n / 2\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\nlet count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\nlet count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n) {\nint count = 0;\nwhile (n > 1) {\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(float n)\n{\nint count = 0;\nwhile (n > 1)\n{\nn = n / 2;\ncount++;\n}\nreturn count;\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Double) -> Int {\nvar count = 0\nvar n = n\nwhile n > 1 {\nn = n / 2\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: f32) i32 {\nvar count: i32 = 0;\nvar n_var = n;\nwhile (n_var > 1)\n{\nn_var = n_var / 2;\ncount +=1;\n}\nreturn count;\n}\n

Fig. \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\u3002\u4ee5\u4e0b\u4ee3\u7801\u5f62\u6210\u4e86\u4e00\u4e2a\u9ad8\u5ea6\u4e3a \\(\\log_2 n\\) \u7684\u9012\u5f52\u6811\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n) {\nif (n <= 1)\nreturn 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n) {\nif (n <= 1)\nreturn 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.py
def log_recur(n: float) -> int:\n\"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n <= 1:\nreturn 0\nreturn log_recur(n / 2) + 1\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n float64) int {\nif n <= 1 {\nreturn 0\n}\nreturn logRecur(n/2) + 1\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n) {\nif (n <= 1)\nreturn 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(float n)\n{\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Double) -> Int {\nif n <= 1 {\nreturn 0\n}\nreturn logRecur(n: n / 2) + 1\n}\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: f32) i32 {\nif (n <= 1) return 0;\nreturn logRecur(n / 2) + 1;\n}\n
"},{"location":"chapter_computational_complexity/time_complexity/#on-log-n","title":"\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

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n) {\nif (n <= 1)\nreturn 1;\nint count = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n) {\nif (n <= 1)\nreturn 1;\nint count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.py
def linear_log_recur(n: float) -> int:\n\"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\nif n <= 1:\nreturn 1\ncount: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\nfor _ in range(n):\ncount += 1\nreturn count\n
time_complexity.go
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n float64) int {\nif n <= 1 {\nreturn 1\n}\ncount := linearLogRecur(n/2) +\nlinearLogRecur(n/2)\nfor i := 0.0; i < n; i++ {\ncount++\n}\nreturn count\n}\n
time_complexity.js
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\nif (n <= 1) return 1;\nlet count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (let i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\nif (n <= 1) return 1;\nlet count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (let i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n) {\nif (n <= 1)\nreturn 1;\nint count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\ncount++;\n}\nreturn count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(float n)\n{\nif (n <= 1) return 1;\nint count = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nfor (int i = 0; i < n; i++)\n{\ncount++;\n}\nreturn count;\n}\n
time_complexity.swift
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Double) -> Int {\nif n <= 1 {\nreturn 1\n}\nvar count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\nfor _ in stride(from: 0, to: n, by: 1) {\ncount += 1\n}\nreturn count\n}\n
time_complexity.zig
// \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: f32) i32 {\nif (n <= 1) return 1;\nvar count: i32 = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nvar i: f32 = 0;\nwhile (i < n) : (i += 1) {\ncount += 1;\n}\nreturn count;\n}\n

Fig. \u7ebf\u6027\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/time_complexity/#on_1","title":"\u9636\u4e58\u9636 \\(O(n!)\\)","text":"

\u9636\u4e58\u9636\u5bf9\u5e94\u6570\u5b66\u4e0a\u7684\u300c\u5168\u6392\u5217\u300d\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 \\cdots \\times 2 \\times 1 \\]

\u9636\u4e58\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u5b9e\u73b0\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\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\u7ec8\u6b62\u5206\u88c2\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig time_complexity.java
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\nif (n == 0)\nreturn 1;\nint count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (int i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.cpp
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\nif (n == 0)\nreturn 1;\nint count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (int i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.py
def factorial_recur(n: int) -> int:\n\"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\nif n == 0:\nreturn 1\ncount: int = 0\n# \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor _ in range(n):\ncount += factorial_recur(n - 1)\nreturn count\n
time_complexity.go
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\nif n == 0 {\nreturn 1\n}\ncount := 0\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor i := 0; i < n; i++ {\ncount += factorialRecur(n - 1)\n}\nreturn count\n}\n
time_complexity.js
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\nif (n == 0) return 1;\nlet count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (let i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.ts
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\nif (n == 0) return 1;\nlet count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (let i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.c
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\nif (n == 0)\nreturn 1;\nint count = 0;\nfor (int i = 0; i < n; i++) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.cs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n)\n{\nif (n == 0) return 1;\nint count = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor (int i = 0; i < n; i++)\n{\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n
time_complexity.swift
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\nif n == 0 {\nreturn 1\n}\nvar count = 0\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nfor _ in 0 ..< n {\ncount += factorialRecur(n: n - 1)\n}\nreturn count\n}\n
time_complexity.zig
// \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\nif (n == 0) return 1;\nvar count: i32 = 0;\nvar i: i32 = 0;\n// \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\nwhile (i < n) : (i += 1) {\ncount += factorialRecur(n - 1);\n}\nreturn count;\n}\n

Fig. \u9636\u4e58\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/time_complexity/#226","title":"2.2.6. \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6","text":"

\u67d0\u4e9b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u4f8b\u5982\uff0c\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\u4f46\u5143\u7d20\u987a\u5e8f\u662f\u968f\u673a\u6253\u4e71\u7684\uff1b\u7b97\u6cd5\u7684\u4efb\u52a1\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\uff1a

  • \u5f53 nums = [?, ?, ..., 1] \uff0c\u5373\u5f53\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u65f6\uff0c\u9700\u8981\u5b8c\u6574\u904d\u5386\u6570\u7ec4\uff0c\u6b64\u65f6\u8fbe\u5230 \u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\)\uff1b
  • \u5f53 nums = [1, ?, ?, ...] \uff0c\u5373\u5f53\u9996\u4e2a\u6570\u5b57\u4e3a \\(1\\) \u65f6\uff0c\u65e0\u8bba\u6570\u7ec4\u591a\u957f\u90fd\u4e0d\u9700\u8981\u7ee7\u7eed\u904d\u5386\uff0c\u6b64\u65f6\u8fbe\u5230 \u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(\\Omega(1)\\)\uff1b

\u201c\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\u201d\u4f7f\u7528\u5927 \\(O\\) \u8bb0\u53f7\u8868\u793a\uff0c\u4ee3\u8868\u300c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u300d\u3002\u76f8\u5e94\u5730\uff0c\u201c\u51fd\u6570\u6e10\u8fd1\u4e0b\u754c\u201d\u7528 \\(\\Omega\\) \u8bb0\u53f7\u6765\u8868\u793a\uff0c\u4ee3\u8868\u300c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u300d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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) {\nInteger[] nums = new Integer[n];\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nCollections.shuffle(Arrays.asList(nums));\n// Integer[] -> int[]\nint[] res = new int[n];\nfor (int i = 0; i < n; i++) {\nres[i] = nums[i];\n}\nreturn res;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\nfor (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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -1;\n}\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) {\nvector<int> nums(n);\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\nunsigned seed = chrono::system_clock::now().time_since_epoch().count();\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nshuffle(nums.begin(), nums.end(), default_random_engine(seed));\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\nfor (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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -1;\n}\n
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\nnums: list[int] = [i for i in range(1, n + 1)]\n# \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nrandom.shuffle(nums)\nreturn nums\ndef find_one(nums: list[int]) -> int:\n\"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\nfor 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)\nif nums[i] == 1:\nreturn i\nreturn -1\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 {\nnums := make([]int, n)\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor i := 0; i < n; i++ {\nnums[i] = i + 1\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nrand.Shuffle(len(nums), func(i, j int) {\nnums[i], nums[j] = nums[j], nums[i]\n})\nreturn nums\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\nfor 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)\nif nums[i] == 1 {\nreturn i\n}\n}\nreturn -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) {\nconst nums = Array(n);\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (let i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (let i = 0; i < n; i++) {\nconst r = Math.floor(Math.random() * (i + 1));\nconst temp = nums[i];\nnums[i] = nums[r];\nnums[r] = temp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\nfor (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)\nif (nums[i] === 1) {\nreturn i;\n}\n}\nreturn -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[] {\nconst nums = Array(n);\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (let i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (let i = 0; i < n; i++) {\nconst r = Math.floor(Math.random() * (i + 1));\nconst temp = nums[i];\nnums[i] = nums[r];\nnums[r] = temp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\nfor (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)\nif (nums[i] === 1) {\nreturn i;\n}\n}\nreturn -1;\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\u4e3an\uff0c\u5143\u7d20\u7c7b\u578b\u4e3aint\uff09\nint *nums = (int *)malloc(n * sizeof(int));\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++) {\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (int i = n - 1; i > 0; i--) {\nint j = rand() % (i + 1);\nint temp = nums[i];\nnums[i] = nums[j];\nnums[j] = temp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\nfor (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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -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{\nint[] nums = new int[n];\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (int i = 0; i < n; i++)\n{\nnums[i] = i + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nfor (int i = 0; i < nums.Length; i++)\n{\nvar index = new Random().Next(i, nums.Length);\nvar tmp = nums[i];\nvar ran = nums[index];\nnums[i] = ran;\nnums[index] = tmp;\n}\nreturn nums;\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums)\n{\nfor (int i = 0; i < nums.Length; i++)\n{\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)\nif (nums[i] == 1)\nreturn i;\n}\nreturn -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 }\nvar nums = Array(1 ... n)\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nnums.shuffle()\nreturn nums\n}\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\nfor 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)\nif nums[i] == 1 {\nreturn i\n}\n}\nreturn -1\n}\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\npub fn randomNumbers(comptime n: usize) [n]i32 {\nvar nums: [n]i32 = undefined;\n// \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\nfor (nums) |*num, i| {\nnum.* = @intCast(i32, i) + 1;\n}\n// \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\nconst rand = std.crypto.random;\nrand.shuffle(i32, &nums);\nreturn nums;\n}\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\npub fn findOne(nums: []i32) i32 {\nfor (nums) |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)\nif (num == 1) return @intCast(i32, i);\n}\nreturn -1;\n}\n

Tip

\u5b9e\u9645\u5e94\u7528\u4e2d\u6211\u4eec\u5f88\u5c11\u4f7f\u7528\u300c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u300d\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\u76f8\u53cd\uff0c\u300c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u300d\u66f4\u4e3a\u5b9e\u7528\uff0c\u56e0\u4e3a\u5b83\u7ed9\u51fa\u4e86\u4e00\u4e2a\u201c\u6548\u7387\u5b89\u5168\u503c\u201d\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\u6216\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ea\u51fa\u73b0\u5728\u201c\u7279\u6b8a\u5206\u5e03\u7684\u6570\u636e\u201d\u4e2d\uff0c\u8fd9\u4e9b\u60c5\u51b5\u7684\u51fa\u73b0\u6982\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u56e0\u6b64\u5e76\u4e0d\u80fd\u6700\u771f\u5b9e\u5730\u53cd\u6620\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u3002\u76f8\u8f83\u4e4b\u4e0b\uff0c\u300c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u300d\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\u5219\u662f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a \\(\\frac{n}{2}\\) \uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(\\Theta(\\frac{n}{2}) = \\Theta(n)\\) \u3002

\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u5c24\u5176\u662f\u8f83\u4e3a\u590d\u6742\u7684\u7b97\u6cd5\uff0c\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u6bd4\u8f83\u56f0\u96be\uff0c\u56e0\u4e3a\u5f88\u96be\u7b80\u4fbf\u5730\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\u6211\u4eec\u5e38\u5e38\u4f7f\u7528\u5b83\u6765\u8868\u793a\u300c\u5e73\u5747\u590d\u6742\u5ea6\u300d\uff0c\u4f46\u4ece\u4e25\u683c\u610f\u4e49\u4e0a\u770b\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/classification_of_data_structure/","title":"3.2. \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u4ece\u903b\u8f91\u7ed3\u6784\u548c\u7269\u7406\u7ed3\u6784\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/#321","title":"3.2.1. \u00a0 \u903b\u8f91\u7ed3\u6784\uff1a\u7ebf\u6027\u4e0e\u975e\u7ebf\u6027","text":"

\u300c\u903b\u8f91\u7ed3\u6784\u300d\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\u987a\u5e8f\u4f9d\u6b21\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\u7956\u5148\u4e0e\u540e\u4ee3\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

\u903b\u8f91\u7ed3\u6784\u901a\u5e38\u5206\u4e3a\u300c\u7ebf\u6027\u300d\u548c\u300c\u975e\u7ebf\u6027\u300d\u4e24\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\uff0c\u4f8b\u5982\u7f51\u72b6\u6216\u6811\u72b6\u7ed3\u6784\u3002

  • \u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\uff1b
  • \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6811\u3001\u56fe\u3001\u5806\u3001\u54c8\u5e0c\u8868\uff1b

Fig. \u7ebf\u6027\u4e0e\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784

"},{"location":"chapter_data_structure/classification_of_data_structure/#322","title":"3.2.2. \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u79bb\u6563","text":"

Note

\u5982\u82e5\u9605\u8bfb\u8d77\u6765\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u4e0b\u4e00\u7ae0\u201c\u6570\u7ec4\u4e0e\u94fe\u8868\u201d\uff0c\u7136\u540e\u518d\u56de\u5934\u7406\u89e3\u7269\u7406\u7ed3\u6784\u7684\u542b\u4e49\u3002

\u300c\u7269\u7406\u7ed3\u6784\u300d\u4f53\u73b0\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\u4ee5\u5206\u4e3a\u6570\u7ec4\u7684\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u94fe\u8868\u7684\u79bb\u6563\u7a7a\u95f4\u5b58\u50a8\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\u540c\u65f6\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u65b9\u9762\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u70b9\u3002

Fig. \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u4e0e\u79bb\u6563\u7a7a\u95f4\u5b58\u50a8

\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\uff1b
  • \u57fa\u4e8e\u94fe\u8868\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\uff1b

\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u4e5f\u88ab\u79f0\u4e3a\u300c\u9759\u6001\u6570\u636e\u7ed3\u6784\u300d\uff0c\u8fd9\u610f\u5473\u7740\u6b64\u7c7b\u6570\u636e\u7ed3\u6784\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u76f8\u5bf9\u5e94\u5730\uff0c\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u88ab\u79f0\u4e3a\u300c\u52a8\u6001\u6570\u636e\u7ed3\u6784\u300d\uff0c\u8fd9\u7c7b\u6570\u636e\u7ed3\u6784\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\u3002

Tip

\u6570\u7ec4\u4e0e\u94fe\u8868\u662f\u5176\u4ed6\u6240\u6709\u6570\u636e\u7ed3\u6784\u7684\u201c\u5e95\u5c42\u79ef\u6728\u201d\uff0c\u5efa\u8bae\u8bfb\u8005\u6295\u5165\u66f4\u591a\u65f6\u95f4\u6df1\u5165\u4e86\u89e3\u8fd9\u4e24\u79cd\u57fa\u672c\u6570\u636e\u7ed3\u6784\u3002

"},{"location":"chapter_data_structure/data_and_memory/","title":"3.1. \u00a0 \u6570\u636e\u4e0e\u5185\u5b58","text":""},{"location":"chapter_data_structure/data_and_memory/#311","title":"3.1.1. \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b","text":"

\u8c08\u53ca\u8ba1\u7b97\u673a\u4e2d\u7684\u6570\u636e\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

\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u8fdb\u884c\u8fd0\u7b97\u7684\u7c7b\u578b\uff0c\u5728\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\u3002

  • \u300c\u6574\u6570\u300d\u6309\u7167\u4e0d\u540c\u7684\u957f\u5ea6\u5206\u4e3a byte, short, int, long \u3002\u5728\u6ee1\u8db3\u53d6\u503c\u8303\u56f4\u7684\u524d\u63d0\u4e0b\uff0c\u6211\u4eec\u5e94\u8be5\u5c3d\u91cf\u9009\u53d6\u8f83\u77ed\u7684\u6574\u6570\u7c7b\u578b\uff0c\u4ee5\u51cf\u5c0f\u5185\u5b58\u7a7a\u95f4\u5360\u7528\uff1b
  • \u300c\u6d6e\u70b9\u6570\u300d\u8868\u793a\u5c0f\u6570\uff0c\u6309\u957f\u5ea6\u5206\u4e3a float, double \uff0c\u9009\u7528\u89c4\u5219\u4e0e\u6574\u6570\u76f8\u540c\u3002
  • \u300c\u5b57\u7b26\u300d\u5728\u8ba1\u7b97\u673a\u4e2d\u4ee5\u5b57\u7b26\u96c6\u5f62\u5f0f\u4fdd\u5b58\uff0cchar \u7684\u503c\u5b9e\u9645\u4e0a\u662f\u6570\u5b57\uff0c\u4ee3\u8868\u5b57\u7b26\u96c6\u4e2d\u7684\u7f16\u53f7\uff0c\u8ba1\u7b97\u673a\u901a\u8fc7\u5b57\u7b26\u96c6\u67e5\u8868\u5b8c\u6210\u7f16\u53f7\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002
  • \u300c\u5e03\u5c14\u300d\u4ee3\u8868\u903b\u8f91\u4e2d\u7684\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\uff0c\u5176\u5360\u7528\u7a7a\u95f4\u9700\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u786e\u5b9a\u3002
\u7c7b\u522b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u53d6\u503c\u8303\u56f4 \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 byte \\(-2^7\\) ~ \\(2^7 - 1\\) ( \\(-128\\) ~ \\(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\\) \u6d6e\u70b9\u6570 float 4 bytes \\(-3.4 \\times 10^{38}\\) ~ \\(3.4 \\times 10^{38}\\) \\(0.0\\) f double 8 bytes \\(-1.7 \\times 10^{308}\\) ~ \\(1.7 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 bytes / 1 byte \\(0\\) ~ \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 byte / 1 bit \\(\\text{true}\\) \u6216 \\(\\text{false}\\) \\(\\text{false}\\)

\u4ee5\u4e0a\u8868\u683c\u4e2d\uff0c\u52a0\u7c97\u9879\u5728\u7b97\u6cd5\u9898\u4e2d\u6700\u4e3a\u5e38\u7528\u3002\u6b64\u8868\u683c\u65e0\u9700\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

"},{"location":"chapter_data_structure/data_and_memory/#_1","title":"\u6574\u6570\u8868\u793a\u65b9\u5f0f","text":"

\u6574\u6570\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u53d8\u91cf\u4f7f\u7528\u7684\u5185\u5b58\u957f\u5ea6\uff0c\u5373\u5b57\u8282\uff08\u6216\u6bd4\u7279\uff09\u6570\u3002\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c1 \u5b57\u8282 (byte) = 8 \u6bd4\u7279 (bit)\uff0c1 \u6bd4\u7279\u5373 1 \u4e2a\u4e8c\u8fdb\u5236\u4f4d\u3002\u4ee5 int \u7c7b\u578b\u4e3a\u4f8b\uff1a

  1. \u6574\u6570\u7c7b\u578b int \u5360\u7528 4 bytes = 32 bits \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u4e0d\u540c\u7684\u6570\u5b57\uff1b
  2. \u5c06\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\\(0\\) \u4ee3\u8868\u6b63\u6570\uff0c\\(1\\) \u4ee3\u8868\u8d1f\u6570\uff0c\u4e00\u5171\u53ef\u8868\u793a \\(2^{31}\\) \u4e2a\u6b63\u6570\u548c \\(2^{31}\\) \u4e2a\u8d1f\u6570\uff1b
  3. \u5f53\u6240\u6709 bits \u4e3a 0 \u65f6\u4ee3\u8868\u6570\u5b57 \\(0\\) \uff0c\u4ece\u96f6\u5f00\u59cb\u589e\u5927\uff0c\u53ef\u5f97\u6700\u5927\u6b63\u6570\u4e3a \\(2^{31} - 1\\) \uff1b
  4. \u5269\u4f59 \\(2^{31}\\) \u4e2a\u6570\u5b57\u5168\u90e8\u7528\u6765\u8868\u793a\u8d1f\u6570\uff0c\u56e0\u6b64\u6700\u5c0f\u8d1f\u6570\u4e3a \\(-2^{31}\\) \uff1b\u5177\u4f53\u7ec6\u8282\u6d89\u53ca\u201c\u6e90\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u201d\u7684\u76f8\u5173\u77e5\u8bc6\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u67e5\u9605\u5b66\u4e60\uff1b

\u5176\u4ed6\u6574\u6570\u7c7b\u578b byte, short, long \u7684\u53d6\u503c\u8303\u56f4\u7684\u8ba1\u7b97\u65b9\u6cd5\u4e0e int \u7c7b\u4f3c\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

"},{"location":"chapter_data_structure/data_and_memory/#_2","title":"\u6d6e\u70b9\u6570\u8868\u793a\u65b9\u5f0f *","text":"

Note

\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u540e\u7684 * \u7b26\u53f7\u4ee3\u8868\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u89c9\u5f97\u7406\u89e3\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u8df3\u8fc7\uff0c\u7b49\u5b66\u5b8c\u5fc5\u8bfb\u7ae0\u8282\u540e\u518d\u5355\u72ec\u653b\u514b\u3002

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 bytes\uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\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\u6839\u636e IEEE 754 \u6807\u51c6\uff0c32-bit \u957f\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u90e8\u5206\u6784\u6210\uff1a

  • \u7b26\u53f7\u4f4d \\(\\mathrm{S}\\) \uff1a\u5360 1 bit \uff1b
  • \u6307\u6570\u4f4d \\(\\mathrm{E}\\) \uff1a\u5360 8 bits \uff1b
  • \u5206\u6570\u4f4d \\(\\mathrm{N}\\) \uff1a\u5360 24 bits \uff0c\u5176\u4e2d 23 \u4f4d\u663e\u5f0f\u5b58\u50a8\uff1b

\u8bbe 32-bit \u4e8c\u8fdb\u5236\u6570\u7684\u7b2c \\(i\\) \u4f4d\u4e3a \\(b_i\\) \uff0c\u5219 float \u503c\u7684\u8ba1\u7b97\u65b9\u6cd5\u5b9a\u4e49\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

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

\u5176\u4e2d\u5404\u9879\u7684\u53d6\u503c\u8303\u56f4\u4e3a

\\[ \\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} \\]

Fig. IEEE 754 \u6807\u51c6\u4e0b\u7684 float \u8868\u793a\u65b9\u5f0f

\u4ee5\u4e0a\u56fe\u4e3a\u4f8b\uff0c\\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u6613\u5f97

\\[ \\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 \u4f4d\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

\u8fdb\u4e00\u6b65\u5730\uff0c\u6307\u6570\u4f4d \\(E = 0\\) \u548c \\(E = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u4e49\uff0c\u7528\u4e8e\u8868\u793a\u96f6\u3001\u65e0\u7a77\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

\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}\\)

\u7279\u522b\u5730\uff0c\u6b21\u6b63\u89c4\u6570\u663e\u8457\u63d0\u5347\u4e86\u6d6e\u70b9\u6570\u7684\u7cbe\u5ea6\uff0c\u8fd9\u662f\u56e0\u4e3a\uff1a

  • \u6700\u5c0f\u6b63\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\approx 1.18 \\times 10^{-38}\\) \uff1b
  • \u6700\u5c0f\u6b63\u6b21\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\times 2^{-23} \\approx 1.4 \\times 10^{-45}\\) \uff1b

\u53cc\u7cbe\u5ea6 double \u4e5f\u91c7\u7528\u7c7b\u4f3c float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u6b64\u5904\u4e0d\u518d\u8be6\u8ff0\u3002

"},{"location":"chapter_data_structure/data_and_memory/#_3","title":"\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u7684\u5173\u7cfb","text":"

\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\uff0c\u5b83\u7684\u6838\u5fc3\u662f\u201c\u7ed3\u6784\u201d\uff0c\u800c\u975e\u201c\u6570\u636e\u201d\u3002\u5982\u679c\u60f3\u8981\u8868\u793a\u201c\u4e00\u6392\u6570\u5b57\u201d\uff0c\u6211\u4eec\u81ea\u7136\u4f1a\u60f3\u5230\u4f7f\u7528\u300c\u6570\u7ec4\u300d\u6570\u636e\u7ed3\u6784\u3002\u6570\u7ec4\u7684\u5b58\u50a8\u65b9\u5f0f\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u3001\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5177\u4f53\u5b58\u50a8\u7684\u662f\u6574\u6570 int \u3001\u5c0f\u6570 float \u3001\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] booleans = new boolean[5];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool booleans[5];\n
# Python \u7684 list \u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\nlist = [0, 0.0, 'a', False]\n
// \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar booleans = [5]bool{}\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\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst booleans: boolean[] = [];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool booleans[10];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] booleans = new bool[5];\n
/* \u4f7f\u7528\u591a\u79cd\u300c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u300d\u6765\u521d\u59cb\u5316\u300c\u6570\u7ec4\u300d */\nlet numbers = Array(repeating: Int(), count: 5)\nlet decimals = Array(repeating: Double(), count: 5)\nlet characters = Array(repeating: Character(\"a\"), count: 5)\nlet booleans = Array(repeating: Bool(), count: 5)\n
\n
"},{"location":"chapter_data_structure/data_and_memory/#312","title":"3.1.2. \u00a0 \u8ba1\u7b97\u673a\u5185\u5b58","text":"

\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u5185\u5b58\u548c\u786c\u76d8\u662f\u4e24\u79cd\u4e3b\u8981\u7684\u5b58\u50a8\u786c\u4ef6\u8bbe\u5907\u3002\u300c\u786c\u76d8\u300d\u4e3b\u8981\u7528\u4e8e\u957f\u671f\u5b58\u50a8\u6570\u636e\uff0c\u5bb9\u91cf\u8f83\u5927\uff08\u901a\u5e38\u53ef\u8fbe\u5230 TB \u7ea7\u522b\uff09\u3001\u901f\u5ea6\u8f83\u6162\u3002\u300c\u5185\u5b58\u300d\u7528\u4e8e\u8fd0\u884c\u7a0b\u5e8f\u65f6\u6682\u5b58\u6570\u636e\uff0c\u901f\u5ea6\u8f83\u5feb\uff0c\u4f46\u5bb9\u91cf\u8f83\u5c0f\uff08\u901a\u5e38\u4e3a GB \u7ea7\u522b\uff09\u3002

\u5728\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u5173\u6570\u636e\u90fd\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u4e0b\u56fe\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 1 byte \u7684\u6570\u636e\uff0c\u5728\u7b97\u6cd5\u8fd0\u884c\u65f6\uff0c\u6240\u6709\u6570\u636e\u90fd\u88ab\u5b58\u50a8\u5728\u8fd9\u4e9b\u5355\u5143\u683c\u4e2d\u3002

\u7cfb\u7edf\u901a\u8fc7\u300c\u5185\u5b58\u5730\u5740 Memory Location\u300d\u6765\u8bbf\u95ee\u76ee\u6807\u5185\u5b58\u4f4d\u7f6e\u7684\u6570\u636e\u3002\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

Fig. \u5185\u5b58\u6761\u3001\u5185\u5b58\u7a7a\u95f4\u3001\u5185\u5b58\u5730\u5740

\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\u5185\u5b58\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u5f53\u5185\u5b58\u88ab\u67d0\u4e2a\u7a0b\u5e8f\u5360\u7528\u65f6\uff0c\u5176\u4ed6\u7a0b\u5e8f\u65e0\u6cd5\u540c\u65f6\u4f7f\u7528\u3002\u6211\u4eec\u9700\u8981\u6839\u636e\u5269\u4f59\u5185\u5b58\u8d44\u6e90\u7684\u5b9e\u9645\u60c5\u51b5\u6765\u8bbe\u8ba1\u7b97\u6cd5\u3002\u4f8b\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\u8fd0\u884c\u7684\u7a0b\u5e8f\u5f88\u591a\u5e76\u4e14\u7f3a\u5c11\u5927\u91cf\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u90a3\u4e48\u6240\u9009\u7528\u7684\u6570\u636e\u7ed3\u6784\u5fc5\u987b\u80fd\u591f\u5b58\u50a8\u5728\u79bb\u6563\u7684\u5185\u5b58\u7a7a\u95f4\u5185\u3002

"},{"location":"chapter_data_structure/summary/","title":"3.3. \u00a0 \u5c0f\u7ed3","text":"
  • \u8ba1\u7b97\u673a\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5305\u62ec\u6574\u6570 byte, short, int, long \u3001\u6d6e\u70b9\u6570 float, double \u3001\u5b57\u7b26 char \u548c\u5e03\u5c14 boolean \uff0c\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\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
  • \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\u548c\u975e\u7ebf\u6027\u7ed3\u6784\u3002
  • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u79bb\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
"},{"location":"chapter_graph/graph/","title":"10.1. \u00a0 \u56fe","text":"

\u300c\u56fe Graph\u300d\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u7531\u300c\u9876\u70b9 Vertex\u300d\u548c\u300c\u8fb9 Edge\u300d\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} \\]

Fig. \u94fe\u8868\u3001\u6811\u3001\u56fe\u4e4b\u95f4\u7684\u5173\u7cfb

\u90a3\u4e48\uff0c\u56fe\u4e0e\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u7684\u5173\u7cfb\u662f\u4ec0\u4e48\uff1f\u5982\u679c\u6211\u4eec\u628a\u300c\u9876\u70b9\u300d\u770b\u4f5c\u8282\u70b9\uff0c\u628a\u300c\u8fb9\u300d\u770b\u4f5c\u8fde\u63a5\u5404\u4e2a\u8282\u70b9\u7684\u6307\u9488\uff0c\u5219\u53ef\u5c06\u300c\u56fe\u300d\u770b\u4f5c\u662f\u4e00\u79cd\u4ece\u300c\u94fe\u8868\u300d\u62d3\u5c55\u800c\u6765\u7684\u6570\u636e\u7ed3\u6784\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\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u4ece\u800c\u66f4\u4e3a\u590d\u6742\u3002

"},{"location":"chapter_graph/graph/#1011","title":"10.1.1. \u00a0 \u56fe\u5e38\u89c1\u7c7b\u578b","text":"

\u6839\u636e\u8fb9\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u4e3a\u300c\u65e0\u5411\u56fe Undirected Graph\u300d\u548c\u300c\u6709\u5411\u56fe Directed Graph\u300d\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\uff1b
  • \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\uff1b

Fig. \u6709\u5411\u56fe\u4e0e\u65e0\u5411\u56fe

\u6839\u636e\u6240\u6709\u9876\u70b9\u662f\u5426\u8fde\u901a\uff0c\u53ef\u5206\u4e3a\u300c\u8fde\u901a\u56fe Connected Graph\u300d\u548c\u300c\u975e\u8fde\u901a\u56fe Disconnected Graph\u300d\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\uff1b
  • \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\uff1b

Fig. \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\u300c\u6709\u6743\u56fe Weighted Graph\u300d\u3002\u4f8b\u5982\uff0c\u5728\u738b\u8005\u8363\u8000\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

Fig. \u6709\u6743\u56fe\u4e0e\u65e0\u6743\u56fe

"},{"location":"chapter_graph/graph/#1012","title":"10.1.2. \u00a0 \u56fe\u5e38\u7528\u672f\u8bed","text":"
  • \u300c\u90bb\u63a5 Adjacency\u300d\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\u4e0a\u56fe\u4e2d\uff0c\u9876\u70b9 1 \u7684\u90bb\u63a5\u9876\u70b9\u4e3a\u9876\u70b9 2\u30013\u30015\u3002
  • \u300c\u8def\u5f84 Path\u300d\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\u4e0a\u56fe\u4e2d\uff0c\u8fb9\u5e8f\u5217 1-5-2-4 \u662f\u9876\u70b9 1 \u5230\u9876\u70b9 4 \u7684\u4e00\u6761\u8def\u5f84\u3002
  • \u300c\u5ea6 Degree\u300d\u8868\u793a\u4e00\u4e2a\u9876\u70b9\u62e5\u6709\u7684\u8fb9\u6570\u3002\u5bf9\u4e8e\u6709\u5411\u56fe\uff0c\u300c\u5165\u5ea6 In-Degree\u300d\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u6307\u5411\u8be5\u9876\u70b9\uff0c\u300c\u51fa\u5ea6 Out-Degree\u300d\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u4ece\u8be5\u9876\u70b9\u6307\u51fa\u3002
"},{"location":"chapter_graph/graph/#1013","title":"10.1.3. \u00a0 \u56fe\u7684\u8868\u793a","text":"

\u56fe\u7684\u5e38\u7528\u8868\u793a\u65b9\u6cd5\u5305\u62ec\u300c\u90bb\u63a5\u77e9\u9635\u300d\u548c\u300c\u90bb\u63a5\u8868\u300d\u3002\u4ee5\u4e0b\u4f7f\u7528\u65e0\u5411\u56fe\u8fdb\u884c\u4e3e\u4f8b\u3002

"},{"location":"chapter_graph/graph/#_1","title":"\u90bb\u63a5\u77e9\u9635","text":"

\u8bbe\u56fe\u7684\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u300c\u90bb\u63a5\u77e9\u9635 Adjacency Matrix\u300d\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\u4e0b\u56fe\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

Fig. \u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a

\u90bb\u63a5\u77e9\u9635\u5177\u6709\u4ee5\u4e0b\u7279\u6027\uff1a

  • \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\\) , \\(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\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":"\u90bb\u63a5\u8868","text":"

\u300c\u90bb\u63a5\u8868 Adjacency List\u300d\u4f7f\u7528 \\(n\\) \u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u94fe\u8868\u8282\u70b9\u8868\u793a\u9876\u70b9\u3002\u7b2c \\(i\\) \u6761\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff08\u5373\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u9876\u70b9\uff09\u3002

Fig. \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\u4e0a\u56fe\u53ef\u53d1\u73b0\uff0c\u90bb\u63a5\u8868\u7ed3\u6784\u4e0e\u54c8\u5e0c\u8868\u4e2d\u7684\u300c\u94fe\u5730\u5740\u6cd5\u300d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u4eec\u4e5f\u53ef\u4ee5\u91c7\u7528\u7c7b\u4f3c\u65b9\u6cd5\u6765\u4f18\u5316\u6548\u7387\u3002\u4f8b\u5982\uff0c\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)\\) \uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u4e2d\u5e8f\u904d\u5386\u83b7\u53d6\u6709\u5e8f\u5e8f\u5217\uff1b\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u54c8\u5e0c\u8868\uff0c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u4f4e\u81f3 \\(O(1)\\) \u3002

"},{"location":"chapter_graph/graph/#1014","title":"10.1.4. \u00a0 \u56fe\u5e38\u89c1\u5e94\u7528","text":"

\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u8bb8\u591a\u7cfb\u7edf\u90fd\u53ef\u4ee5\u7528\u56fe\u6765\u5efa\u6a21\uff0c\u76f8\u5e94\u7684\u5f85\u6c42\u89e3\u95ee\u9898\u4e5f\u53ef\u4ee5\u7ea6\u5316\u4e3a\u56fe\u8ba1\u7b97\u95ee\u9898\u3002

\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":"10.2. \u00a0 \u56fe\u57fa\u7840\u64cd\u4f5c","text":"

\u56fe\u7684\u57fa\u7840\u64cd\u4f5c\u53ef\u5206\u4e3a\u5bf9\u300c\u8fb9\u300d\u7684\u64cd\u4f5c\u548c\u5bf9\u300c\u9876\u70b9\u300d\u7684\u64cd\u4f5c\u3002\u5728\u300c\u90bb\u63a5\u77e9\u9635\u300d\u548c\u300c\u90bb\u63a5\u8868\u300d\u4e24\u79cd\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5b9e\u73b0\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

"},{"location":"chapter_graph/graph_operations/#1021","title":"10.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\u6709\uff1a

  • \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

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u7684\u5b9e\u73b0\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_adjacency_matrix.java
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nList<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\nList<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u65b9\u6cd5 */\npublic GraphAdjMat(int[] vertices, int[][] edges) {\nthis.vertices = new ArrayList<>();\nthis.adjMat = new ArrayList<>();\n// \u6dfb\u52a0\u9876\u70b9\nfor (int val : vertices) {\naddVertex(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\nfor (int[] e : edges) {\naddEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size() {\nreturn vertices.size();\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(int val) {\nint n = size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.add(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nList<Integer> newRow = new ArrayList<>(n);\nfor (int j = 0; j < n; j++) {\nnewRow.add(0);\n}\nadjMat.add(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (List<Integer> row : adjMat) {\nrow.add(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(int index) {\nif (index >= size())\nthrow new IndexOutOfBoundsException();\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.remove(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.remove(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (List<Integer> row : adjMat) {\nrow.remove(index);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void addEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfBoundsException();\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat.get(i).set(j, 1);\nadjMat.get(j).set(i, 1);\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void removeEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfBoundsException();\nadjMat.get(i).set(j, 0);\nadjMat.get(j).set(i, 0);\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\npublic void print() {\nSystem.out.print(\"\u9876\u70b9\u5217\u8868 = \");\nSystem.out.println(vertices);\nSystem.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\nPrintUtil.printMatrix(adjMat);\n}\n}\n
graph_adjacency_matrix.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nvector<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\nvector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nGraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n// \u6dfb\u52a0\u9876\u70b9\nfor (int val : vertices) {\naddVertex(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\nfor (const vector<int> &edge : edges) {\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nint size() const {\nreturn vertices.size();\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(int val) {\nint n = size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.push_back(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nadjMat.emplace_back(n, 0);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (vector<int> &row : adjMat) {\nrow.push_back(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(int index) {\nif (index >= size()) {\nthrow out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.erase(vertices.begin() + index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.erase(adjMat.begin() + index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (vector<int> &row : adjMat) {\nrow.erase(row.begin() + index);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\nthrow out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat[i][j] = 1;\nadjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(int i, int j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\nthrow out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n}\nadjMat[i][j] = 0;\nadjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid print() {\ncout << \"\u9876\u70b9\u5217\u8868 = \";\nprintVector(vertices);\ncout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\nprintVectorMatrix(adjMat);\n}\n};\n
graph_adjacency_matrix.py
class GraphAdjMat:\n\"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\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\nvertices: list[int] = []\n# \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\nadj_mat: list[list[int]] = []\ndef __init__(self, vertices: list[int], edges: list[list[int]]) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.vertices: list[int] = []\nself.adj_mat: list[list[int]] = []\n# \u6dfb\u52a0\u9876\u70b9\nfor val in vertices:\nself.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\nfor e in edges:\nself.add_edge(e[0], e[1])\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\nreturn len(self.vertices)\ndef add_vertex(self, val: int) -> None:\n\"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\nn = self.size()\n# \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nself.vertices.append(val)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nnew_row = [0] * n\nself.adj_mat.append(new_row)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor row in self.adj_mat:\nrow.append(0)\ndef remove_vertex(self, index: int) -> None:\n\"\"\"\u5220\u9664\u9876\u70b9\"\"\"\nif index >= self.size():\nraise IndexError()\n# \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nself.vertices.pop(index)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nself.adj_mat.pop(index)\n# \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor row in self.adj_mat:\nrow.pop(index)\ndef add_edge(self, i: int, j: int) -> None:\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\nif i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\nraise IndexError()\n# \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nself.adj_mat[i][j] = 1\nself.adj_mat[j][i] = 1\ndef remove_edge(self, i: int, j: int) -> None:\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\nif i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\nraise IndexError()\nself.adj_mat[i][j] = 0\nself.adj_mat[j][i] = 0\ndef print(self) -> None:\n\"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\nprint(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\nprint(\"\u90bb\u63a5\u77e9\u9635 =\")\nprint_matrix(self.adj_mat)\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\nvertices []int\n// \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\nadjMat [][]int\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n// \u6dfb\u52a0\u9876\u70b9\nn := len(vertices)\nadjMat := make([][]int, n)\nfor i := range adjMat {\nadjMat[i] = make([]int, n)\n}\n// \u521d\u59cb\u5316\u56fe\ng := &graphAdjMat{\nvertices: vertices,\nadjMat:   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\nfor i := range edges {\ng.addEdge(edges[i][0], edges[i][1])\n}\nreturn g\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\nreturn len(g.vertices)\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\nn := g.size()\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\ng.vertices = append(g.vertices, val)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nnewRow := make([]int, n)\ng.adjMat = append(g.adjMat, newRow)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor i := range g.adjMat {\ng.adjMat[i] = append(g.adjMat[i], 0)\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\nif index >= g.size() {\nreturn\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\ng.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\ng.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor i := range g.adjMat {\ng.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\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\nif i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\nfmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\ng.adjMat[i][j] = 1\ng.adjMat[j][i] = 1\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\nif i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\nfmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n}\ng.adjMat[i][j] = 0\ng.adjMat[j][i] = 0\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\nfmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\nfmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\nfor i := range g.adjMat {\nfmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n}\n}\n
graph_adjacency_matrix.js
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nvertices; // \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\nadjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u51fd\u6570 */\nconstructor(vertices, edges) {\nthis.vertices = [];\nthis.adjMat = [];\n// \u6dfb\u52a0\u9876\u70b9\nfor (const val of vertices) {\nthis.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\nfor (const e of edges) {\nthis.addEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize() {\nreturn this.vertices.length;\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(val) {\nconst n = this.size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nthis.vertices.push(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nconst newRow = [];\nfor (let j = 0; j < n; j++) {\nnewRow.push(0);\n}\nthis.adjMat.push(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (const row of this.adjMat) {\nrow.push(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(index) {\nif (index >= this.size()) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nthis.vertices.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nthis.adjMat.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (const row of this.adjMat) {\nrow.splice(index, 1);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\naddEdge(i, j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nthis.adjMat[i][j] = 1;\nthis.adjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nremoveEdge(i, j) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\nthis.adjMat[i][j] = 0;\nthis.adjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nprint() {\nconsole.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\nconsole.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 {\nvertices: 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\nadjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u51fd\u6570 */\nconstructor(vertices: number[], edges: number[][]) {\nthis.vertices = [];\nthis.adjMat = [];\n// \u6dfb\u52a0\u9876\u70b9\nfor (const val of vertices) {\nthis.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\nfor (const e of edges) {\nthis.addEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize(): number {\nreturn this.vertices.length;\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(val: number): void {\nconst n: number = this.size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nthis.vertices.push(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nconst newRow: number[] = [];\nfor (let j: number = 0; j < n; j++) {\nnewRow.push(0);\n}\nthis.adjMat.push(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor (const row of this.adjMat) {\nrow.push(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(index: number): void {\nif (index >= this.size()) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nthis.vertices.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nthis.adjMat.splice(index, 1);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor (const row of this.adjMat) {\nrow.splice(index, 1);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\naddEdge(i: number, j: number): void {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nthis.adjMat[i][j] = 1;\nthis.adjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nremoveEdge(i: number, j: number): void {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\nthrow new RangeError('Index Out Of Bounds Exception');\n}\nthis.adjMat[i][j] = 0;\nthis.adjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nprint(): void {\nconsole.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\nconsole.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n}\n}\n
graph_adjacency_matrix.c
[class]{graphAdjMat}-[func]{}\n
graph_adjacency_matrix.cs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat\n{\nList<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\nList<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u51fd\u6570 */\npublic GraphAdjMat(int[] vertices, int[][] edges)\n{\nthis.vertices = new List<int>();\nthis.adjMat = new List<List<int>>();\n// \u6dfb\u52a0\u9876\u70b9\nforeach (int val in vertices)\n{\naddVertex(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\nforeach (int[] e in edges)\n{\naddEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size()\n{\nreturn vertices.Count;\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(int val)\n{\nint n = size();\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.Add(val);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nList<int> newRow = new List<int>(n);\nfor (int j = 0; j < n; j++)\n{\nnewRow.Add(0);\n}\nadjMat.Add(newRow);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nforeach (List<int> row in adjMat)\n{\nrow.Add(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(int index)\n{\nif (index >= size())\nthrow new IndexOutOfRangeException();\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.RemoveAt(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.RemoveAt(index);\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nforeach (List<int> row in adjMat)\n{\nrow.RemoveAt(index);\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void addEdge(int i, int j)\n{\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfRangeException();\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat[i][j] = 1;\nadjMat[j][i] = 1;\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\npublic void removeEdge(int i, int j)\n{\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\nthrow new IndexOutOfRangeException();\nadjMat[i][j] = 0;\nadjMat[j][i] = 0;\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\npublic void print()\n{\nConsole.Write(\"\u9876\u70b9\u5217\u8868 = \");\nPrintUtil.PrintList(vertices);\nConsole.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\nPrintUtil.printMatrix(adjMat);\n}\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\nprivate 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\nprivate var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n/* \u6784\u9020\u65b9\u6cd5 */\ninit(vertices: [Int], edges: [[Int]]) {\nself.vertices = []\nadjMat = []\n// \u6dfb\u52a0\u9876\u70b9\nfor val in vertices {\naddVertex(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\nfor e in edges {\naddEdge(i: e[0], j: e[1])\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc size() -> Int {\nvertices.count\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc addVertex(val: Int) {\nlet n = size()\n// \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\nvertices.append(val)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\nlet newRow = Array(repeating: 0, count: n)\nadjMat.append(newRow)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\nfor i in adjMat.indices {\nadjMat[i].append(0)\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\nfunc removeVertex(index: Int) {\nif index >= size() {\nfatalError(\"\u8d8a\u754c\")\n}\n// \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\nvertices.remove(at: index)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\nadjMat.remove(at: index)\n// \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\nfor i in adjMat.indices {\nadjMat[i].remove(at: index)\n}\n}\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc addEdge(i: Int, j: Int) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif i < 0 || j < 0 || i >= size() || j >= size() || i == j {\nfatalError(\"\u8d8a\u754c\")\n}\n// \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u6cbf\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\nadjMat[i][j] = 1\nadjMat[j][i] = 1\n}\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc removeEdge(i: Int, j: Int) {\n// \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\nif i < 0 || j < 0 || i >= size() || j >= size() || i == j {\nfatalError(\"\u8d8a\u754c\")\n}\nadjMat[i][j] = 0\nadjMat[j][i] = 0\n}\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc print() {\nSwift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\nSwift.print(vertices)\nSwift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\nPrintUtil.printMatrix(matrix: adjMat)\n}\n}\n
graph_adjacency_matrix.zig
\n
"},{"location":"chapter_graph/graph_operations/#1022","title":"10.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\u6709\uff1a

  • \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(1)\\) \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

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u56fe\u7684\u4ee3\u7801\u793a\u4f8b\u3002\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u6ce8\u610f\u5230\uff0c\u6211\u4eec\u5728\u90bb\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u8282\u70b9\u7c7b\u6765\u8868\u793a\u9876\u70b9\uff0c\u8fd9\u6837\u505a\u7684\u539f\u56e0\u6709\uff1a

  • \u5982\u679c\u6211\u4eec\u9009\u62e9\u901a\u8fc7\u9876\u70b9\u503c\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\uff0c\u90a3\u4e48\u503c\u91cd\u590d\u7684\u9876\u70b9\u5c06\u65e0\u6cd5\u88ab\u533a\u5206\u3002
  • \u5982\u679c\u7c7b\u4f3c\u90bb\u63a5\u77e9\u9635\u90a3\u6837\uff0c\u4f7f\u7528\u9876\u70b9\u5217\u8868\u7d22\u5f15\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\u3002\u90a3\u4e48\uff0c\u5047\u8bbe\u6211\u4eec\u60f3\u8981\u5220\u9664\u7d22\u5f15\u4e3a \\(i\\) \u7684\u9876\u70b9\uff0c\u5219\u9700\u8981\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5c06\u5176\u4e2d \\(> i\\) \u7684\u7d22\u5f15\u5168\u90e8\u51cf \\(1\\) \uff0c\u8fd9\u6837\u64cd\u4f5c\u6548\u7387\u8f83\u4f4e\u3002
  • \u56e0\u6b64\u6211\u4eec\u8003\u8651\u5f15\u5165\u9876\u70b9\u7c7b Vertex \uff0c\u4f7f\u5f97\u6bcf\u4e2a\u9876\u70b9\u90fd\u662f\u552f\u4e00\u7684\u5bf9\u8c61\uff0c\u6b64\u65f6\u5220\u9664\u9876\u70b9\u65f6\u5c31\u65e0\u9700\u6539\u52a8\u5176\u4f59\u9876\u70b9\u4e86\u3002
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_adjacency_list.java
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n// \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nMap<Vertex, List<Vertex>> adjList;\n/* \u6784\u9020\u65b9\u6cd5 */\npublic GraphAdjList(Vertex[][] edges) {\nthis.adjList = new HashMap<>();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (Vertex[] edge : edges) {\naddVertex(edge[0]);\naddVertex(edge[1]);\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size() {\nreturn adjList.size();\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic void addEdge(Vertex vet1, Vertex vet2) {\nif (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\nthrow new IllegalArgumentException();\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList.get(vet1).add(vet2);\nadjList.get(vet2).add(vet1);\n}\n/* \u5220\u9664\u8fb9 */\npublic void removeEdge(Vertex vet1, Vertex vet2) {\nif (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\nthrow new IllegalArgumentException();\n// \u5220\u9664\u8fb9 vet1 - vet2\nadjList.get(vet1).remove(vet2);\nadjList.get(vet2).remove(vet1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(Vertex vet) {\nif (adjList.containsKey(vet))\nreturn;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList.put(vet, new ArrayList<>());\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(Vertex vet) {\nif (!adjList.containsKey(vet))\nthrow new IllegalArgumentException();\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.remove(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (List<Vertex> list : adjList.values()) {\nlist.remove(vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic void print() {\nSystem.out.println(\"\u90bb\u63a5\u8868 =\");\nfor (Map.Entry<Vertex, List<Vertex>> entry : adjList.entrySet()) {\nList<Integer> tmp = new ArrayList<>();\nfor (Vertex vertex : entry.getValue())\ntmp.add(vertex.val);\nSystem.out.println(entry.getKey().val + \": \" + tmp + \",\");\n}\n}\n}\n
graph_adjacency_list.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\npublic:\n// \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nunordered_map<Vertex *, vector<Vertex *>> adjList;\n/* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\nvoid remove(vector<Vertex *> &vec, Vertex *vet) {\nfor (int i = 0; i < vec.size(); i++) {\nif (vec[i] == vet) {\nvec.erase(vec.begin() + i);\nbreak;\n}\n}\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nGraphAdjList(const vector<vector<Vertex *>> &edges) {\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (const vector<Vertex *> &edge : edges) {\naddVertex(edge[0]);\naddVertex(edge[1]);\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nint size() {\nreturn adjList.size();\n}\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(Vertex *vet1, Vertex *vet2) {\nif (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\nthrow invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList[vet1].push_back(vet2);\nadjList[vet2].push_back(vet1);\n}\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(Vertex *vet1, Vertex *vet2) {\nif (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\nthrow invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n// \u5220\u9664\u8fb9 vet1 - vet2\nremove(adjList[vet1], vet2);\nremove(adjList[vet2], vet1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(Vertex *vet) {\nif (adjList.count(vet))\nreturn;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList[vet] = vector<Vertex *>();\n}\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(Vertex *vet) {\nif (!adjList.count(vet))\nthrow invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.erase(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (auto &adj : adjList) {\nremove(adj.second, vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nvoid print() {\ncout << \"\u90bb\u63a5\u8868 =\" << endl;\nfor (auto &adj : adjList) {\nconst auto &key = adj.first;\nconst auto &vec = adj.second;\ncout << key->val << \": \";\nprintVector(vetsToVals(vec));\n}\n}\n};\n
graph_adjacency_list.py
class GraphAdjList:\n\"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\ndef __init__(self, edges: list[list[Vertex]]) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n# \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nself.adj_list = dict[Vertex, Vertex]()\n# \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor edge in edges:\nself.add_vertex(edge[0])\nself.add_vertex(edge[1])\nself.add_edge(edge[0], edge[1])\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\nreturn len(self.adj_list)\ndef add_edge(self, vet1: Vertex, vet2: Vertex) -> None:\n\"\"\"\u6dfb\u52a0\u8fb9\"\"\"\nif vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\nraise ValueError\n# \u6dfb\u52a0\u8fb9 vet1 - vet2\nself.adj_list[vet1].append(vet2)\nself.adj_list[vet2].append(vet1)\ndef remove_edge(self, vet1: Vertex, vet2: Vertex) -> None:\n\"\"\"\u5220\u9664\u8fb9\"\"\"\nif vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\nraise ValueError\n# \u5220\u9664\u8fb9 vet1 - vet2\nself.adj_list[vet1].remove(vet2)\nself.adj_list[vet2].remove(vet1)\ndef add_vertex(self, vet: Vertex) -> None:\n\"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\nif vet in self.adj_list:\nreturn\n# \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nself.adj_list[vet] = []\ndef remove_vertex(self, vet: Vertex) -> None:\n\"\"\"\u5220\u9664\u9876\u70b9\"\"\"\nif vet not in self.adj_list:\nraise ValueError\n# \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nself.adj_list.pop(vet)\n# \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor vertex in self.adj_list:\nif vet in self.adj_list[vertex]:\nself.adj_list[vertex].remove(vet)\ndef print(self) -> None:\n\"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\nprint(\"\u90bb\u63a5\u8868 =\")\nfor vertex in self.adj_list:\ntmp = [v.val for v in self.adj_list[vertex]]\nprint(f\"{vertex.val}: {tmp},\")\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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nadjList map[Vertex][]Vertex\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\ng := &graphAdjList{\nadjList: make(map[Vertex][]Vertex),\n}\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor _, edge := range edges {\ng.addVertex(edge[0])\ng.addVertex(edge[1])\ng.addEdge(edge[0], edge[1])\n}\nreturn g\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\nreturn len(g.adjList)\n}\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n_, ok1 := g.adjList[vet1]\n_, ok2 := g.adjList[vet2]\nif !ok1 || !ok2 || vet1 == vet2 {\npanic(\"error\")\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\ng.adjList[vet1] = append(g.adjList[vet1], vet2)\ng.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n_, ok1 := g.adjList[vet1]\n_, ok2 := g.adjList[vet2]\nif !ok1 || !ok2 || vet1 == vet2 {\npanic(\"error\")\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nDeleteSliceElms(g.adjList[vet1], vet2)\nDeleteSliceElms(g.adjList[vet2], vet1)\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n_, ok := g.adjList[vet]\nif ok {\nreturn\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\ng.adjList[vet] = make([]Vertex, 0)\n}\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n_, ok := g.adjList[vet]\nif !ok {\npanic(\"error\")\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\ndelete(g.adjList, vet)\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor _, list := range g.adjList {\nDeleteSliceElms(list, vet)\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\nvar builder strings.Builder\nfmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\nfor k, v := range g.adjList {\nbuilder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\nfor _, vet := range v {\nbuilder.WriteString(strconv.Itoa(vet.Val) + \" \")\n}\nfmt.Println(builder.String())\nbuilder.Reset()\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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nadjList;\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(edges) {\nthis.adjList = new Map();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (const edge of edges) {\nthis.addVertex(edge[0]);\nthis.addVertex(edge[1]);\nthis.addEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize() {\nreturn this.adjList.size;\n}\n/* \u6dfb\u52a0\u8fb9 */\naddEdge(vet1, vet2) {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).push(vet2);\nthis.adjList.get(vet2).push(vet1);\n}\n/* \u5220\u9664\u8fb9 */\nremoveEdge(vet1, vet2) {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\nthis.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(vet) {\nif (this.adjList.has(vet)) return;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nthis.adjList.set(vet, []);\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(vet) {\nif (!this.adjList.has(vet)) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nthis.adjList.delete(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (let set of this.adjList.values()) {\nconst index = set.indexOf(vet);\nif (index > -1) {\nset.splice(index, 1);\n}\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nprint() {\nconsole.log('\u90bb\u63a5\u8868 =');\nfor (const [key, value] of this.adjList) {\nconst tmp = [];\nfor (const vertex of value) {\ntmp.push(vertex.val);\n}\nconsole.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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nadjList: Map<Vertex, Vertex[]>;\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(edges: Vertex[][]) {\nthis.adjList = new Map();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor (const edge of edges) {\nthis.addVertex(edge[0]);\nthis.addVertex(edge[1]);\nthis.addEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nsize(): number {\nreturn this.adjList.size;\n}\n/* \u6dfb\u52a0\u8fb9 */\naddEdge(vet1: Vertex, vet2: Vertex): void {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).push(vet2);\nthis.adjList.get(vet2).push(vet1);\n}\n/* \u5220\u9664\u8fb9 */\nremoveEdge(vet1: Vertex, vet2: Vertex): void {\nif (\n!this.adjList.has(vet1) ||\n!this.adjList.has(vet2) ||\nvet1 === vet2\n) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nthis.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\nthis.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\naddVertex(vet: Vertex): void {\nif (this.adjList.has(vet)) return;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nthis.adjList.set(vet, []);\n}\n/* \u5220\u9664\u9876\u70b9 */\nremoveVertex(vet: Vertex): void {\nif (!this.adjList.has(vet)) {\nthrow new Error('Illegal Argument Exception');\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nthis.adjList.delete(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor (let set of this.adjList.values()) {\nconst index: number = set.indexOf(vet);\nif (index > -1) {\nset.splice(index, 1);\n}\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nprint(): void {\nconsole.log('\u90bb\u63a5\u8868 =');\nfor (const [key, value] of this.adjList.entries()) {\nconst tmp = [];\nfor (const vertex of value) {\ntmp.push(vertex.val);\n}\nconsole.log(key.val + ': ' + tmp.join());\n}\n}\n}\n
graph_adjacency_list.c
[class]{graphAdjList}-[func]{}\n
graph_adjacency_list.cs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList\n{\n// \u90bb\u63a5\u8868\uff0ckey: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\npublic Dictionary<Vertex, List<Vertex>> adjList;\n/* \u6784\u9020\u51fd\u6570 */\npublic GraphAdjList(Vertex[][] edges)\n{\nthis.adjList = new Dictionary<Vertex, List<Vertex>>();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nforeach (Vertex[] edge in edges)\n{\naddVertex(edge[0]);\naddVertex(edge[1]);\naddEdge(edge[0], edge[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size()\n{\nreturn adjList.Count;\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic void addEdge(Vertex vet1, Vertex vet2)\n{\nif (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\nthrow new InvalidOperationException();\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList[vet1].Add(vet2);\nadjList[vet2].Add(vet1);\n}\n/* \u5220\u9664\u8fb9 */\npublic void removeEdge(Vertex vet1, Vertex vet2)\n{\nif (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\nthrow new InvalidOperationException();\n// \u5220\u9664\u8fb9 vet1 - vet2\nadjList[vet1].Remove(vet2);\nadjList[vet2].Remove(vet1);\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic void addVertex(Vertex vet)\n{\nif (adjList.ContainsKey(vet))\nreturn;\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList.Add(vet, new List<Vertex>());\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(Vertex vet)\n{\nif (!adjList.ContainsKey(vet))\nthrow new InvalidOperationException();\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.Remove(vet);\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nforeach (List<Vertex> list in adjList.Values)\n{\nlist.Remove(vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic void print()\n{\nConsole.WriteLine(\"\u90bb\u63a5\u8868 =\");\nforeach (KeyValuePair<Vertex, List<Vertex>> entry in adjList)\n{\nList<int> tmp = new List<int>();\nforeach (Vertex vertex in entry.Value)\ntmp.Add(vertex.Val);\nConsole.WriteLine(entry.Key.Val + \": [\" + string.Join(\", \", tmp) + \"],\");\n}\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: \u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\npublic private(set) var adjList: [Vertex: [Vertex]]\n/* \u6784\u9020\u65b9\u6cd5 */\npublic init(edges: [[Vertex]]) {\nadjList = [:]\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nfor edge in edges {\naddVertex(vet: edge[0])\naddVertex(vet: edge[1])\naddEdge(vet1: edge[0], vet2: edge[1])\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic func size() -> Int {\nadjList.count\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic func addEdge(vet1: Vertex, vet2: Vertex) {\nif adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\nfatalError(\"\u53c2\u6570\u9519\u8bef\")\n}\n// \u6dfb\u52a0\u8fb9 vet1 - vet2\nadjList[vet1]?.append(vet2)\nadjList[vet2]?.append(vet1)\n}\n/* \u5220\u9664\u8fb9 */\npublic func removeEdge(vet1: Vertex, vet2: Vertex) {\nif adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\nfatalError(\"\u53c2\u6570\u9519\u8bef\")\n}\n// \u5220\u9664\u8fb9 vet1 - vet2\nadjList[vet1]?.removeAll(where: { $0 == vet2 })\nadjList[vet2]?.removeAll(where: { $0 == vet1 })\n}\n/* \u6dfb\u52a0\u9876\u70b9 */\npublic func addVertex(vet: Vertex) {\nif adjList[vet] != nil {\nreturn\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\nadjList[vet] = []\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic func removeVertex(vet: Vertex) {\nif adjList[vet] == nil {\nfatalError(\"\u53c2\u6570\u9519\u8bef\")\n}\n// \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\nadjList.removeValue(forKey: vet)\n// \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\nfor key in adjList.keys {\nadjList[key]?.removeAll(where: { $0 == vet })\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic func print() {\nSwift.print(\"\u90bb\u63a5\u8868 =\")\nfor entry in adjList {\nvar tmp: [Int] = []\nfor vertex in entry.value {\ntmp.append(vertex.val)\n}\nSwift.print(\"\\(entry.key.val): \\(tmp),\")\n}\n}\n}\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
"},{"location":"chapter_graph/graph_operations/#1023","title":"10.2.3. \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

\u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\u4e0b\u8868\u4e3a\u90bb\u63a5\u77e9\u9635\u548c\u90bb\u63a5\u8868\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u6548\u7387\u5bf9\u6bd4\u3002

\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\u4e0a\u8868\uff0c\u4f3c\u4e4e\u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09\u7684\u65f6\u95f4\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\u8981\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":"10.3. \u00a0 \u56fe\u7684\u904d\u5386","text":"

\u56fe\u4e0e\u6811\u7684\u5173\u7cfb

\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\u662f\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\uff0c\u5efa\u8bae\u4f60\u5728\u5b66\u4e60\u672c\u7ae0\u8282\u65f6\u878d\u4f1a\u8d2f\u901a\u4e24\u8005\u7684\u6982\u5ff5\u4e0e\u5b9e\u73b0\u65b9\u6cd5\u3002

\u300c\u56fe\u300d\u548c\u300c\u6811\u300d\u90fd\u662f\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u90fd\u9700\u8981\u4f7f\u7528\u300c\u641c\u7d22\u7b97\u6cd5\u300d\u6765\u5b9e\u73b0\u904d\u5386\u64cd\u4f5c\u3002

\u4e0e\u6811\u7c7b\u4f3c\uff0c\u56fe\u7684\u904d\u5386\u65b9\u5f0f\u4e5f\u53ef\u5206\u4e3a\u4e24\u79cd\uff0c\u5373\u300c\u5e7f\u5ea6\u4f18\u5148\u904d\u5386 Breadth-First Traversal\u300d\u548c\u300c\u6df1\u5ea6\u4f18\u5148\u904d\u5386 Depth-First Traversal\u300d\uff0c\u4e5f\u79f0\u4e3a\u300c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 Breadth-First Search\u300d\u548c\u300c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22 Depth-First Search\u300d\uff0c\u7b80\u79f0 BFS \u548c DFS\u3002

"},{"location":"chapter_graph/graph_traversal/#1031","title":"10.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\u8ddd\u79bb\u6700\u8fd1\u7684\u9876\u70b9\u5f00\u59cb\u8bbf\u95ee\uff0c\u5e76\u4e00\u5c42\u5c42\u5411\u5916\u6269\u5f20\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\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

Fig. \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#_1","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"

BFS \u901a\u5e38\u501f\u52a9\u300c\u961f\u5217\u300d\u6765\u5b9e\u73b0\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\uff1b
  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\uff1b
  3. \u5faa\u73af\u6b65\u9aa4 2. \uff0c\u76f4\u5230\u6240\u6709\u9876\u70b9\u88ab\u8bbf\u95ee\u5b8c\u6210\u540e\u7ed3\u675f\uff1b

\u4e3a\u4e86\u9632\u6b62\u91cd\u590d\u904d\u5386\u9876\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_bfs.java
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nList<Vertex> res = new ArrayList<>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nSet<Vertex> visited = new HashSet<>() {{ add(startVet); }};\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nQueue<Vertex> que = new LinkedList<>() {{ offer(startVet); }};\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (!que.isEmpty()) {\nVertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (Vertex adjVet : graph.adjList.get(vet)) {\nif (visited.contains(adjVet))\ncontinue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nque.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.cpp
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nvector<Vertex *> res;\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nunordered_set<Vertex *> visited = {startVet};\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nqueue<Vertex *> que;\nque.push(startVet);\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (!que.empty()) {\nVertex *vet = que.front();\nque.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (auto adjVet : graph.adjList[vet]) {\nif (visited.count(adjVet))\ncontinue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nque.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n\"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS\"\"\"\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\nres = []\n# \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited = set[Vertex]([start_vet])\n# \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nque = deque[Vertex]([start_vet])\n# \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile len(que) > 0:\nvet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n# \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adj_vet in graph.adj_list[vet]:\nif adj_vet in visited:\ncontinue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nque.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n# \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n
graph_bfs.go
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nres := make([]Vertex, 0)\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited := make(map[Vertex]struct{})\nvisited[startVet] = struct{}{}\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\nqueue := make([]Vertex, 0)\nqueue = append(queue, startVet)\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nfor len(queue) > 0 {\n// \u961f\u9996\u9876\u70b9\u51fa\u961f\nvet := queue[0]\nqueue = queue[1:]\n// \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nres = append(res, vet)\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor _, adjVet := range g.adjList[vet] {\n_, isExist := visited[adjVet]\n// \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nif !isExist {\nqueue = append(queue, adjVet)\nvisited[adjVet] = struct{}{}\n}\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n}\n
graph_bfs.js
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nconst res = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited = new Set();\nvisited.add(startVet);\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nconst que = [startVet];\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (que.length) {\nconst vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet) ?? []) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.ts
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nconst res: Vertex[] = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited: Set<Vertex> = new Set();\nvisited.add(startVet);\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nconst que = [startVet];\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (que.length) {\nconst vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet) ?? []) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\nvisited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.c
[class]{}-[func]{graphBFS}\n
graph_bfs.cs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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{\n// \u9876\u70b9\u904d\u5386\u5e8f\u5217\nList<Vertex> res = new List<Vertex>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nHashSet<Vertex> visited = new HashSet<Vertex>() { startVet };\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nQueue<Vertex> que = new Queue<Vertex>();\nque.Enqueue(startVet);\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile (que.Count > 0)\n{\nVertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nforeach (Vertex adjVet in graph.adjList[vet])\n{\nif (visited.Contains(adjVet))\n{\ncontinue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res;\n}\n
graph_bfs.swift
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 BFS */\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\nvar res: [Vertex] = []\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvar visited: Set<Vertex> = [startVet]\n// \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\nvar que: [Vertex] = [startVet]\n// \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\nwhile !que.isEmpty {\nlet vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\nres.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adjVet in graph.adjList[vet] ?? [] {\nif visited.contains(adjVet) {\ncontinue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\nque.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\nvisited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n}\n}\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n}\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n

\u4ee3\u7801\u76f8\u5bf9\u62bd\u8c61\uff0c\u5efa\u8bae\u5bf9\u7167\u4ee5\u4e0b\u52a8\u753b\u56fe\u793a\u6765\u52a0\u6df1\u7406\u89e3\u3002

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

\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\u662f\u5141\u8bb8\u88ab\u4efb\u610f\u6253\u4e71\u7684\u3002\u4ee5\u4e0a\u56fe\u4e3a\u4f8b\uff0c\u9876\u70b9 \\(1\\) , \\(3\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\u3001\u9876\u70b9 \\(2\\) , \\(4\\) , \\(6\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u6362\u3002

"},{"location":"chapter_graph/graph_traversal/#_2","title":"\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\u8868 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/#1032","title":"10.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\u5177\u4f53\u5730\uff0c\u4ece\u67d0\u4e2a\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

Fig. \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#_3","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"

\u8fd9\u79cd\u201c\u8d70\u5230\u5c3d\u5934 + \u56de\u6eaf\u201d\u7684\u7b97\u6cd5\u5f62\u5f0f\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002\u4e0e BFS \u7c7b\u4f3c\uff0c\u5728 DFS \u4e2d\u6211\u4eec\u4e5f\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 visited \u6765\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\uff0c\u4ee5\u907f\u514d\u91cd\u590d\u8bbf\u95ee\u9876\u70b9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig graph_dfs.java
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\nres.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (Vertex adjVet : graph.adjList.get(vet)) {\nif (visited.contains(adjVet))\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nList<Vertex> res = new ArrayList<>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nSet<Vertex> visited = new HashSet<>();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.cpp
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\nres.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (Vertex *adjVet : graph.adjList[vet]) {\nif (visited.count(adjVet))\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nvector<Vertex *> res;\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nunordered_set<Vertex *> visited;\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n\"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570\"\"\"\nres.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n# \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adjVet in graph.adj_list[vet]:\nif adjVet in visited:\ncontinue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n# \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet)\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n\"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS\"\"\"\n# \u9876\u70b9\u904d\u5386\u5e8f\u5217\nres = []\n# \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited = set[Vertex]()\ndfs(graph, visited, res, start_vet)\nreturn res\n
graph_dfs.go
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \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)\nvisited[vet] = struct{}{}\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor _, adjVet := range g.adjList[vet] {\n_, isExist := visited[adjVet]\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\nif !isExist {\ndfs(g, visited, res, adjVet)\n}\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nres := make([]Vertex, 0)\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvisited := make(map[Vertex]struct{})\ndfs(g, visited, &res, startVet)\n// \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\nreturn res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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) {\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet)) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nconst res = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited = new Set();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\ngraph: GraphAdjList,\nvisited: Set<Vertex>,\nres: Vertex[],\nvet: Vertex\n): void {\nres.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor (const adjVet of graph.adjList.get(vet)) {\nif (visited.has(adjVet)) {\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nconst res: Vertex[] = [];\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nconst visited: Set<Vertex> = new Set();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.c
[class]{}-[func]{dfs}\n[class]{}-[func]{graphDFS}\n
graph_dfs.cs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet)\n{\nres.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nforeach (Vertex adjVet in graph.adjList[vet])\n{\nif (visited.Contains(adjVet))\n{\ncontinue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9                             \n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph, visited, res, adjVet);\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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{\n// \u9876\u70b9\u904d\u5386\u5e8f\u5217\nList<Vertex> res = new List<Vertex>();\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nHashSet<Vertex> visited = new HashSet<Vertex>();\ndfs(graph, visited, res, startVet);\nreturn res;\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS \u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\nres.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\nvisited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n// \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfor adjVet in graph.adjList[vet] ?? [] {\nif visited.contains(adjVet) {\ncontinue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n}\n// \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\ndfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n}\n}\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 DFS */\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\nvar res: [Vertex] = []\n// \u54c8\u5e0c\u8868\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\nvar visited: Set<Vertex> = []\ndfs(graph: graph, visited: &visited, res: &res, vet: startVet)\nreturn res\n}\n
graph_dfs.zig
[class]{}-[func]{dfs}\n[class]{}-[func]{graphDFS}\n

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5176\u4e2d\uff1a

  • \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\uff1b
  • \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\u9012\u5f52\u65b9\u6cd5\u7684\u4f4d\u7f6e\uff1b

\u4e3a\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8bae\u5c06\u56fe\u793a\u4e0e\u4ee3\u7801\u7ed3\u5408\u8d77\u6765\uff0c\u5728\u8111\u4e2d\uff08\u6216\u8005\u7528\u7b14\u753b\u4e0b\u6765\uff09\u6a21\u62df\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>

\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\u3001\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u3001\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\u4e0d\u540c\u7684\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/#_4","title":"\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\u8868 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":"10.4. \u00a0 \u5c0f\u7ed3","text":"
  • \u56fe\u7531\u9876\u70b9\u548c\u8fb9\u7ec4\u6210\uff0c\u53ef\u4ee5\u88ab\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\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\\) \u6761\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\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\u89d2\u5ea6\u5206\u6790\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff0c\u90bb\u63a5\u8868\u4f53\u73b0\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_hashing/hash_collision/","title":"7.2. \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

\u5728\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570\u5e94\u4e3a\u6bcf\u4e2a\u8f93\u5165\u751f\u6210\u552f\u4e00\u7684\u8f93\u51fa\uff0c\u5b9e\u73b0 key \u548c value \u7684\u4e00\u4e00\u5bf9\u5e94\u3002\u7136\u800c\u5b9e\u9645\u4e0a\uff0c\u5411\u54c8\u5e0c\u51fd\u6570\u8f93\u5165\u4e0d\u540c\u7684 key \u5374\u4ea7\u751f\u76f8\u540c\u8f93\u51fa\u7684\u60c5\u51b5\u662f\u5b58\u5728\u7684\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u300c\u54c8\u5e0c\u51b2\u7a81 Hash Collision\u300d\u3002\u54c8\u5e0c\u51b2\u7a81\u53ef\u80fd\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u9519\u8bef\uff0c\u4ece\u800c\u4e25\u91cd\u5f71\u54cd\u54c8\u5e0c\u8868\u7684\u53ef\u7528\u6027\u3002

\u90a3\u4e48\uff0c\u4e3a\u4f55\u4f1a\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u5462\uff1f\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u7531\u4e8e\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u5165\u7a7a\u95f4\u901a\u5e38\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff0c\u56e0\u6b64\u591a\u4e2a\u8f93\u5165\u4ea7\u751f\u76f8\u540c\u8f93\u51fa\u7684\u60c5\u51b5\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u4f8b\u5982\uff0c\u82e5\u8f93\u5165\u7a7a\u95f4\u4e3a\u5168\u4f53\u6574\u6570\uff0c\u800c\u8f93\u51fa\u7a7a\u95f4\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u6570\u7ec4\uff0c\u5219\u5fc5\u7136\u6709\u591a\u4e2a\u6574\u6570\u6620\u5c04\u81f3\u540c\u4e00\u6570\u7ec4\u7d22\u5f15\u3002

\u4e3a\u4e86\u51cf\u8f7b\u54c8\u5e0c\u51b2\u7a81\uff0c\u4e00\u65b9\u9762\uff0c\u53ef\u4ee5\u901a\u8fc7\u6269\u5927\u54c8\u5e0c\u8868\u5bb9\u91cf\u6765\u964d\u4f4e\u51b2\u7a81\u6982\u7387\u3002\u6781\u7aef\u60c5\u51b5\u4e0b\uff0c\u5f53\u8f93\u5165\u7a7a\u95f4\u548c\u8f93\u51fa\u7a7a\u95f4\u5927\u5c0f\u76f8\u7b49\u65f6\uff0c\u54c8\u5e0c\u8868\u7b49\u540c\u4e8e\u6570\u7ec4\uff0c\u6bcf\u4e2a key \u90fd\u5bf9\u5e94\u552f\u4e00\u7684\u6570\u7ec4\u7d22\u5f15\uff0c\u53ef\u8c13\u201c\u5927\u529b\u51fa\u5947\u8ff9\u201d\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u53ef\u4ee5\u8003\u8651\u4f18\u5316\u54c8\u5e0c\u8868\u7684\u8868\u793a\u4ee5\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\uff0c\u5e38\u7528\u65b9\u6cd5\u5305\u62ec\u300c\u94fe\u5f0f\u5730\u5740 Separate Chaining\u300d\u548c\u300c\u5f00\u653e\u5bfb\u5740 Open Addressing\u300d\u3002

"},{"location":"chapter_hashing/hash_collision/#721","title":"7.2.1. \u00a0 \u54c8\u5e0c\u8868\u6269\u5bb9","text":"

\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u901a\u5e38\u662f\u5bf9\u6876\u6570\u91cf \\(n\\) \u53d6\u4f59\uff0c\u4f5c\u7528\u662f\u5c06\u54c8\u5e0c\u503c\u6620\u5c04\u5230\u6876\u7d22\u5f15\u8303\u56f4\uff0c\u4ece\u800c\u5c06 key \u653e\u5165\u5bf9\u5e94\u7684\u6876\u4e2d\u3002\u5f53\u54c8\u5e0c\u8868\u5bb9\u91cf\u8d8a\u5927\uff08\u5373 \\(n\\) \u8d8a\u5927\uff09\u65f6\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\u5f53\u54c8\u5e0c\u8868\u5185\u7684\u51b2\u7a81\u603b\u4f53\u8f83\u4e3a\u4e25\u91cd\u65f6\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u7f13\u89e3\u51b2\u7a81\u3002\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\u5f00\u9500\u8f83\u5927\u3002

\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f7f\u7528\u300c\u8d1f\u8f7d\u56e0\u5b50 Load Factor\u300d\u6765\u8861\u91cf\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u4e2d\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u5e38\u4f5c\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u89e6\u53d1\u6761\u4ef6\u3002\u5728 Java \u4e2d\uff0c\u5f53\u8d1f\u8f7d\u56e0\u5b50 \\(> 0.75\\) \u65f6\uff0c\u7cfb\u7edf\u4f1a\u5c06 HashMap \u5bb9\u91cf\u6269\u5c55\u4e3a\u539f\u5148\u7684 \\(2\\) \u500d\u3002

"},{"location":"chapter_hashing/hash_collision/#722","title":"7.2.2. \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\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

Fig. \u94fe\u5f0f\u5730\u5740

\u94fe\u5f0f\u5730\u5740\u4e0b\uff0c\u54c8\u5e0c\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u5305\u62ec\uff1a

  • \u67e5\u8be2\u5143\u7d20\uff1a\u8f93\u5165 key \uff0c\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u6570\u7ec4\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\u5148\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u5c06\u8282\u70b9\uff08\u5373\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\uff0c\u5e76\u5c06\u5176\u5220\u9664\u3002

\u5c3d\u7ba1\u94fe\u5f0f\u5730\u5740\u6cd5\u89e3\u51b3\u4e86\u54c8\u5e0c\u51b2\u7a81\u95ee\u9898\uff0c\u4f46\u4ecd\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\uff0c\u5305\u62ec\uff1a

  • \u5360\u7528\u7a7a\u95f4\u589e\u5927\uff0c\u7531\u4e8e\u94fe\u8868\u6216\u4e8c\u53c9\u6811\u5305\u542b\u8282\u70b9\u6307\u9488\uff0c\u76f8\u6bd4\u6570\u7ec4\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\uff1b
  • \u67e5\u8be2\u6548\u7387\u964d\u4f4e\uff0c\u56e0\u4e3a\u9700\u8981\u7ebf\u6027\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\uff1b

\u4e3a\u4e86\u63d0\u9ad8\u64cd\u4f5c\u6548\u7387\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u300cAVL \u6811\u300d\u6216\u300c\u7ea2\u9ed1\u6811\u300d\uff0c\u5c06\u67e5\u8be2\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002

"},{"location":"chapter_hashing/hash_collision/#723","title":"7.2.3. \u00a0 \u5f00\u653e\u5bfb\u5740","text":"

\u300c\u5f00\u653e\u5bfb\u5740\u300d\u65b9\u6cd5\u4e0d\u5f15\u5165\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u800c\u662f\u901a\u8fc7\u201c\u591a\u6b21\u63a2\u6d4b\u201d\u6765\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u63a2\u6d4b\u65b9\u4e3b\u8981\u5305\u62ec\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u3001\u591a\u6b21\u54c8\u5e0c\u3002

"},{"location":"chapter_hashing/hash_collision/#_1","title":"\u7ebf\u6027\u63a2\u6d4b","text":"

\u300c\u7ebf\u6027\u63a2\u6d4b\u300d\u91c7\u7528\u56fa\u5b9a\u6b65\u957f\u7684\u7ebf\u6027\u67e5\u627e\u6765\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u3002

\u63d2\u5165\u5143\u7d20\uff1a\u82e5\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\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\u4f4d\uff0c\u5c06\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002

\u67e5\u627e\u5143\u7d20\uff1a\u5728\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u65f6\uff0c\u4f7f\u7528\u76f8\u540c\u6b65\u957f\u8fdb\u884c\u7ebf\u6027\u67e5\u627e\uff0c\u53ef\u80fd\u9047\u5230\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

  1. \u627e\u5230\u5bf9\u5e94\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b
  2. \u82e5\u9047\u5230\u7a7a\u4f4d\uff0c\u8bf4\u660e\u76ee\u6807\u952e\u503c\u5bf9\u4e0d\u5728\u54c8\u5e0c\u8868\u4e2d\uff1b

Fig. \u7ebf\u6027\u63a2\u6d4b

\u7ebf\u6027\u63a2\u6d4b\u5b58\u5728\u4ee5\u4e0b\u7f3a\u9677\uff1a

  • \u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u3002\u5220\u9664\u5143\u7d20\u4f1a\u5728\u6570\u7ec4\u5185\u4ea7\u751f\u4e00\u4e2a\u7a7a\u4f4d\uff0c\u67e5\u627e\u5176\u4ed6\u5143\u7d20\u65f6\uff0c\u8be5\u7a7a\u4f4d\u53ef\u80fd\u5bfc\u81f4\u7a0b\u5e8f\u8bef\u5224\u5143\u7d20\u4e0d\u5b58\u5728\uff08\u5373\u4e0a\u8ff0\u7b2c 2. \u79cd\u60c5\u51b5\uff09\u3002\u56e0\u6b64\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u6807\u5fd7\u4f4d\u6765\u6807\u8bb0\u5df2\u5220\u9664\u5143\u7d20\u3002
  • \u5bb9\u6613\u4ea7\u751f\u805a\u96c6\u3002\u6570\u7ec4\u5185\u8fde\u7eed\u88ab\u5360\u7528\u4f4d\u7f6e\u8d8a\u957f\uff0c\u8fd9\u4e9b\u8fde\u7eed\u4f4d\u7f6e\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u8fdb\u4e00\u6b65\u4fc3\u4f7f\u8fd9\u4e00\u4f4d\u7f6e\u7684\u201c\u805a\u5806\u751f\u957f\u201d\uff0c\u6700\u7ec8\u5bfc\u81f4\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u964d\u4f4e\u3002
"},{"location":"chapter_hashing/hash_collision/#_2","title":"\u591a\u6b21\u54c8\u5e0c","text":"

\u987e\u540d\u601d\u4e49\uff0c\u300c\u591a\u6b21\u54c8\u5e0c\u300d\u65b9\u6cd5\u662f\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\) , \\(f_2(x)\\) , \\(f_3(x)\\) , \\(\\cdots\\) \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\u5b58\u5728\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\uff1a

  1. \u5982\u679c\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de\u4e4b\uff1b
  2. \u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5c1d\u8bd5\u6240\u6709\u54c8\u5e0c\u51fd\u6570\uff0c\u5219\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u4e0d\u5b58\u5728\u8be5\u5143\u7d20\uff1b

\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\u589e\u52a0\u989d\u5916\u7684\u8ba1\u7b97\u91cf\u3002

\u54c8\u5e0c\u8868\u8bbe\u8ba1\u65b9\u6848

Java \u91c7\u7528\u300c\u94fe\u5f0f\u5730\u5740\u300d\u3002\u81ea JDK 1.8 \u4ee5\u6765\uff0c\u5f53 HashMap \u5185\u6570\u7ec4\u957f\u5ea6\u5927\u4e8e 64 \u4e14\u94fe\u8868\u957f\u5ea6\u5927\u4e8e 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u88ab\u8f6c\u6362\u4e3a\u300c\u7ea2\u9ed1\u6811\u300d\u4ee5\u63d0\u5347\u67e5\u627e\u6027\u80fd\u3002

Python \u91c7\u7528\u300c\u5f00\u653e\u5bfb\u5740\u300d\u3002\u5b57\u5178 dict \u4f7f\u7528\u4f2a\u968f\u673a\u6570\u8fdb\u884c\u63a2\u6d4b\u3002

Golang \u91c7\u7528\u300c\u94fe\u5f0f\u5730\u5740\u300d\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":"7.1. \u00a0 \u54c8\u5e0c\u8868","text":"

\u54c8\u5e0c\u8868\u901a\u8fc7\u5efa\u7acb\u300c\u952e key\u300d\u4e0e\u300c\u503c value\u300d\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\u8f93\u5165\u4e00\u4e2a key\uff0c\u5219\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u5bf9\u5e94\u7684 value \u3002

\u4ee5\u4e00\u4e2a\u5305\u542b \\(n\\) \u4e2a\u5b66\u751f\u7684\u6570\u636e\u5e93\u4e3a\u4f8b\uff0c\u6bcf\u4e2a\u5b66\u751f\u90fd\u6709\u201c\u59d3\u540d name\u201d\u548c\u201c\u5b66\u53f7 id\u201d\u4e24\u9879\u6570\u636e\u3002\u5047\u5982\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u4f8b\u5982\u201c\u8f93\u5165\u4e00\u4e2a\u5b66\u53f7\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u59d3\u540d\u201d\uff0c\u5219\u53ef\u4ee5\u91c7\u7528\u54c8\u5e0c\u8868\u6765\u5b9e\u73b0\u3002

Fig. \u54c8\u5e0c\u8868\u7684\u62bd\u8c61\u8868\u793a

\u9664\u54c8\u5e0c\u8868\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u6216\u94fe\u8868\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u5404\u9879\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5982\u4e0b\u8868\u6240\u793a\u3002

\u5728\u54c8\u5e0c\u8868\u4e2d\u589e\u5220\u67e5\u6539\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u5168\u9762\u80dc\u51fa\uff01\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u5e38\u7528\u4e8e\u5bf9\u67e5\u627e\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u7684\u573a\u666f\u3002

\u6570\u7ec4 \u94fe\u8868 \u54c8\u5e0c\u8868 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_hashing/hash_map/#711","title":"7.1.1. \u00a0 \u54c8\u5e0c\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u54c8\u5e0c\u8868\u7684\u57fa\u672c\u64cd\u4f5c\u5305\u62ec \u521d\u59cb\u5316\u3001\u67e5\u8be2\u64cd\u4f5c\u3001\u6dfb\u52a0\u4e0e\u5220\u9664\u952e\u503c\u5bf9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig hash_map.java
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<Integer, String> map = new HashMap<>();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");   map.put(15937, \"\u5c0f\u5570\");   map.put(16750, \"\u5c0f\u7b97\");   map.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9e2d\");\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
hash_map.cpp
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nunordered_map<int, string> map;\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.erase(10583);\n
hash_map.py
# \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nmapp: Dict = {}\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmapp[12836] = \"\u5c0f\u54c8\"\nmapp[15937] = \"\u5c0f\u5570\"\nmapp[16750] = \"\u5c0f\u7b97\"\nmapp[13276] = \"\u5c0f\u6cd5\"\nmapp[10583] = \"\u5c0f\u9e2d\"\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname: str = mapp[15937]\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmapp.pop(10583)\n
hash_map.go
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nmapp := make(map[int]string)\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmapp[12836] = \"\u5c0f\u54c8\"\nmapp[15937] = \"\u5c0f\u5570\"\nmapp[16750] = \"\u5c0f\u7b97\"\nmapp[13276] = \"\u5c0f\u6cd5\"\nmapp[10583] = \"\u5c0f\u9e2d\"\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname := mapp[15937]\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\ndelete(mapp, 10583)\n
hash_map.js
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new ArrayHashMap();\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\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/* \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.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\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)\nmap.Add(12836, \"\u5c0f\u54c8\");\nmap.Add(15937, \"\u5c0f\u5570\");\nmap.Add(16750, \"\u5c0f\u7b97\");\nmap.Add(13276, \"\u5c0f\u6cd5\");\nmap.Add(10583, \"\u5c0f\u9e2d\");\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.Remove(10583);\n
hash_map.swift
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nvar map: [Int: String] = [:]\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/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\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.zig
\n

\u904d\u5386\u54c8\u5e0c\u8868\u6709\u4e09\u79cd\u65b9\u5f0f\uff0c\u5373 \u904d\u5386\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u3001\u904d\u5386\u503c\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig hash_map.java
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\nSystem.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (int key: map.keySet()) {\nSystem.out.println(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (String val: map.values()) {\nSystem.out.println(val);\n}\n
hash_map.cpp
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (auto kv: map) {\ncout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (auto key: map) {\ncout << key.first << endl;\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (auto val: map) {\ncout << val.second << endl;\n}\n
hash_map.py
# \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value in mapp.items():\nprint(key, \"->\", value)\n# \u5355\u72ec\u904d\u5386\u952e key\nfor key in mapp.keys():\nprint(key)\n# \u5355\u72ec\u904d\u5386\u503c value\nfor value in mapp.values():\nprint(value)\n
hash_map_test.go
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value := range mapp {\nfmt.Println(key, \"->\", value)\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor key := range mapp {\nfmt.Println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor _, value := range mapp {\nfmt.Println(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()) {\nconsole.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\nconsole.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\nconsole.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()) {\nconsole.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\nconsole.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\nconsole.info(v);\n}\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
hash_map.cs
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nforeach (var kv in map)\n{\nConsole.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nforeach (int key in map.Keys)\n{\nConsole.WriteLine(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nforeach (String val in map.Values)\n{\nConsole.WriteLine(val);\n}\n
hash_map.swift
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in map {\nprint(\"\\(key) -> \\(value)\")\n}\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys {\nprint(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values {\nprint(value)\n}\n
hash_map.zig
\n
"},{"location":"chapter_hashing/hash_map/#712","title":"7.1.2. \u00a0 \u54c8\u5e0c\u51fd\u6570","text":"

\u54c8\u5e0c\u8868\u7684\u5e95\u5c42\u5b9e\u73b0\u4e3a\u6570\u7ec4\uff0c\u540c\u65f6\u53ef\u80fd\u5305\u542b\u94fe\u8868\u3001\u4e8c\u53c9\u6811\uff08\u7ea2\u9ed1\u6811\uff09\u7b49\u6570\u636e\u7ed3\u6784\uff0c\u4ee5\u63d0\u9ad8\u67e5\u8be2\u6027\u80fd\uff08\u5c06\u5728\u4e0b\u8282\u8ba8\u8bba\uff09\u3002

\u9996\u5148\u8003\u8651\u6700\u7b80\u5355\u7684\u60c5\u51b5\uff0c\u4ec5\u4f7f\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u5b9e\u73b0\u54c8\u5e0c\u8868\u3002\u901a\u5e38\uff0c\u6211\u4eec\u5c06\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u7a7a\u4f4d\u79f0\u4e3a\u300c\u6876 Bucket\u300d\uff0c\u7528\u4e8e\u5b58\u50a8\u952e\u503c\u5bf9\u3002

\u6211\u4eec\u5c06\u952e\u503c\u5bf9 key, value \u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b Entry \uff0c\u5e76\u5c06\u6240\u6709 Entry \u653e\u5165\u6570\u7ec4\u4e2d\u3002\u8fd9\u6837\uff0c\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a Entry \u90fd\u5177\u6709\u552f\u4e00\u7684\u7d22\u5f15\u3002\u4e3a\u4e86\u5efa\u7acb key \u548c\u7d22\u5f15\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528\u300c\u54c8\u5e0c\u51fd\u6570 Hash Function\u300d\u3002

\u8bbe\u54c8\u5e0c\u8868\u7684\u6570\u7ec4\u4e3a buckets \uff0c\u54c8\u5e0c\u51fd\u6570\u4e3a f(x) \uff0c\u90a3\u4e48\u67e5\u8be2\u64cd\u4f5c\u7684\u6b65\u9aa4\u5982\u4e0b\uff1a

  1. \u8f93\u5165 key \uff0c\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u51fa\u7d22\u5f15 index \uff0c\u5373 index = f(key) \uff1b
  2. \u901a\u8fc7\u7d22\u5f15\u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5230\u952e\u503c\u5bf9 entry \uff0c\u5373 entry = buckets[index] \uff0c\u7136\u540e\u4ece entry \u4e2d\u83b7\u53d6\u5bf9\u5e94\u7684 value \uff1b

\u4ee5\u5b66\u751f\u6570\u636e key \u5b66\u53f7 -> value \u59d3\u540d \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8bbe\u8ba1\u5982\u4e0b\u54c8\u5e0c\u51fd\u6570\uff1a

\\[ f(x) = x \\% 100 \\]

Fig. \u54c8\u5e0c\u51fd\u6570\u5de5\u4f5c\u539f\u7406

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_hash_map.java
/* \u952e\u503c\u5bf9 int->String */\nclass Entry {\npublic int key;\npublic String val;\npublic Entry(int key, String val) {\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate List<Entry> buckets;\npublic ArrayHashMap() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets = new ArrayList<>();\nfor (int i = 0; i < 100; i++) {\nbuckets.add(null);\n}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate int hashFunc(int key) {\nint index = key % 100;\nreturn index;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\npublic String get(int key) {\nint index = hashFunc(key);\nEntry pair = buckets.get(index);\nif (pair == null)\nreturn null;\nreturn pair.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\npublic void put(int key, String val) {\nEntry pair = new Entry(key, val);\nint index = hashFunc(key);\nbuckets.set(index, pair);\n}\n/* \u5220\u9664\u64cd\u4f5c */\npublic void remove(int key) {\nint index = hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nbuckets.set(index, null);\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic List<Entry> entrySet() {\nList<Entry> entrySet = new ArrayList<>();\nfor (Entry pair : buckets) {\nif (pair != null)\nentrySet.add(pair);\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic List<Integer> keySet() {\nList<Integer> keySet = new ArrayList<>();\nfor (Entry pair : buckets) {\nif (pair != null)\nkeySet.add(pair.key);\n}\nreturn keySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\npublic List<String> valueSet() {\nList<String> valueSet = new ArrayList<>();\nfor (Entry pair : buckets) {\nif (pair != null)\nvalueSet.add(pair.val);\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic void print() {\nfor (Entry kv : entrySet()) {\nSystem.out.println(kv.key + \" -> \" + kv.val);\n}\n}\n}\n
array_hash_map.cpp
/* \u952e\u503c\u5bf9 int->String */\nstruct Entry {\npublic:\nint key;\nstring val;\nEntry(int key, string val) {\nthis->key = key;\nthis->val = val;\n}\n};\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate:\nvector<Entry *> buckets;\npublic:\nArrayHashMap() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets = vector<Entry *>(100);\n}\n~ArrayHashMap() {\n// \u91ca\u653e\u5185\u5b58\nfor (const auto &bucket : buckets) {\ndelete bucket;\n}\nbuckets.clear();\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(int key) {\nint index = key % 100;\nreturn index;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nstring get(int key) {\nint index = hashFunc(key);\nEntry *pair = buckets[index];\nif (pair == nullptr)\nreturn nullptr;\nreturn pair->val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(int key, string val) {\nEntry *pair = new Entry(key, val);\nint index = hashFunc(key);\nbuckets[index] = pair;\n}\n/* \u5220\u9664\u64cd\u4f5c */\nvoid remove(int key) {\nint index = hashFunc(key);\n// \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\ndelete buckets[index];\nbuckets[index] = nullptr;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvector<Entry *> entrySet() {\nvector<Entry *> entrySet;\nfor (Entry *pair : buckets) {\nif (pair != nullptr) {\nentrySet.push_back(pair);\n}\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvector<int> keySet() {\nvector<int> keySet;\nfor (Entry *pair : buckets) {\nif (pair != nullptr) {\nkeySet.push_back(pair->key);\n}\n}\nreturn keySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvector<string> valueSet() {\nvector<string> valueSet;\nfor (Entry *pair : buckets) {\nif (pair != nullptr) {\nvalueSet.push_back(pair->val);\n}\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print() {\nfor (Entry *kv : entrySet()) {\ncout << kv->key << \" -> \" << kv->val << endl;\n}\n}\n};\n
array_hash_map.py
class Entry:\n\"\"\"\u952e\u503c\u5bf9 int->String\"\"\"\ndef __init__(self, key: int, val: str):\nself.key = key\nself.val = val\nclass ArrayHashMap:\n\"\"\"\u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n# \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nself.buckets: list[Entry | None] = [None] * 100\ndef hash_func(self, key: int) -> int:\n\"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\nindex: int = key % 100\nreturn index\ndef get(self, key: int) -> str:\n\"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\nindex: int = self.hash_func(key)\npair: Entry = self.buckets[index]\nif pair is None:\nreturn None\nreturn pair.val\ndef put(self, key: int, val: str) -> None:\n\"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\npair = Entry(key, val)\nindex: int = self.hash_func(key)\nself.buckets[index] = pair\ndef remove(self, key: int) -> None:\n\"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\nindex: int = self.hash_func(key)\n# \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\nself.buckets[index] = None\ndef entry_set(self) -> list[Entry]:\n\"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\nresult: list[Entry] = []\nfor pair in self.buckets:\nif pair is not None:\nresult.append(pair)\nreturn result\ndef key_set(self) -> list[int]:\n\"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\nresult: list[int] = []\nfor pair in self.buckets:\nif pair is not None:\nresult.append(pair.key)\nreturn result\ndef value_set(self) -> list[str]:\n\"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\nresult: list[str] = []\nfor pair in self.buckets:\nif pair is not None:\nresult.append(pair.val)\nreturn result\ndef print(self) -> None:\n\"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\nfor pair in self.buckets:\nif pair is not None:\nprint(pair.key, \"->\", pair.val)\n
array_hash_map.go
/* \u952e\u503c\u5bf9 int->String */\ntype entry struct {\nkey int\nval string\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\nbuckets []*entry\n}\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets := make([]*entry, 100)\nreturn &arrayHashMap{buckets: buckets}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\nindex := key % 100\nreturn index\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\nindex := a.hashFunc(key)\npair := a.buckets[index]\nif pair == nil {\nreturn \"Not Found\"\n}\nreturn pair.val\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\npair := &entry{key: key, val: val}\nindex := a.hashFunc(key)\na.buckets[index] = pair\n}\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\nindex := a.hashFunc(key)\n// \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\na.buckets[index] = nil\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) entrySet() []*entry {\nvar pairs []*entry\nfor _, pair := range a.buckets {\nif pair != nil {\npairs = append(pairs, pair)\n}\n}\nreturn pairs\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\nvar keys []int\nfor _, pair := range a.buckets {\nif pair != nil {\nkeys = append(keys, pair.key)\n}\n}\nreturn keys\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\nvar values []string\nfor _, pair := range a.buckets {\nif pair != nil {\nvalues = append(values, pair.val)\n}\n}\nreturn values\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\nfor _, pair := range a.buckets {\nif pair != nil {\nfmt.Println(pair.key, \"->\", pair.val)\n}\n}\n}\n
array_hash_map.js
/* \u952e\u503c\u5bf9 Number -> String */\nclass Entry {\nconstructor(key, val) {\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n#buckets;\nconstructor() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nthis.#buckets = new Array(100).fill(null);\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\n#hashFunc(key) {\nreturn key % 100;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nget(key) {\nlet index = this.#hashFunc(key);\nlet entry = this.#buckets[index];\nif (entry === null) return null;\nreturn entry.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nset(key, val) {\nlet index = this.#hashFunc(key);\nthis.#buckets[index] = new Entry(key, val);\n}\n/* \u5220\u9664\u64cd\u4f5c */\ndelete(key) {\nlet index = this.#hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nthis.#buckets[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nentries() {\nlet arr = [];\nfor (let i = 0; i < this.#buckets.length; i++) {\nif (this.#buckets[i]) {\narr.push(this.#buckets[i]);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nkeys() {\nlet arr = [];\nfor (let i = 0; i < this.#buckets.length; i++) {\nif (this.#buckets[i]) {\narr.push(this.#buckets[i]?.key);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvalues() {\nlet arr = [];\nfor (let i = 0; i < this.#buckets.length; i++) {\nif (this.#buckets[i]) {\narr.push(this.#buckets[i]?.val);\n}\n}\nreturn arr;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nprint() {\nlet entrySet = this.entries();\nfor (const entry of entrySet) {\nif (!entry) continue;\nconsole.info(`${entry.key} -> ${entry.val}`);\n}\n}\n}\n
array_hash_map.ts
/* \u952e\u503c\u5bf9 Number -> String */\nclass Entry {\npublic key: number;\npublic val: string;\nconstructor(key: number, val: string) {\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate readonly buckets: (Entry | null)[];\nconstructor() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nthis.buckets = new Array(100).fill(null);\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate hashFunc(key: number): number {\nreturn key % 100;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\npublic get(key: number): string | null {\nlet index = this.hashFunc(key);\nlet entry = this.buckets[index];\nif (entry === null) return null;\nreturn entry.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\npublic set(key: number, val: string) {\nlet index = this.hashFunc(key);\nthis.buckets[index] = new Entry(key, val);\n}\n/* \u5220\u9664\u64cd\u4f5c */\npublic delete(key: number) {\nlet index = this.hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nthis.buckets[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic entries(): (Entry | null)[] {\nlet arr: (Entry | null)[] = [];\nfor (let i = 0; i < this.buckets.length; i++) {\nif (this.buckets[i]) {\narr.push(this.buckets[i]);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic keys(): (number | undefined)[] {\nlet arr: (number | undefined)[] = [];\nfor (let i = 0; i < this.buckets.length; i++) {\nif (this.buckets[i]) {\narr.push(this.buckets[i]?.key);\n}\n}\nreturn arr;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\npublic values(): (string | undefined)[] {\nlet arr: (string | undefined)[] = [];\nfor (let i = 0; i < this.buckets.length; i++) {\nif (this.buckets[i]) {\narr.push(this.buckets[i]?.val);\n}\n}\nreturn arr;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic print() {\nlet entrySet = this.entries();\nfor (const entry of entrySet) {\nif (!entry) continue;\nconsole.info(`${entry.key} -> ${entry.val}`);\n}\n}\n}\n
array_hash_map.c
[class]{entry}-[func]{}\n[class]{arrayHashMap}-[func]{}\n
array_hash_map.cs
/* \u952e\u503c\u5bf9 int->String */\nclass Entry\n{\npublic int key;\npublic String val;\npublic Entry(int key, String val)\n{\nthis.key = key;\nthis.val = val;\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap\n{\nprivate List<Entry?> buckets;\npublic ArrayHashMap()\n{\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nbuckets = new();\nfor (int i = 0; i < 100; i++)\n{\nbuckets.Add(null);\n}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate int hashFunc(int key)\n{\nint index = key % 100;\nreturn index;\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\npublic String? get(int key)\n{\nint index = hashFunc(key);\nEntry? pair = buckets[index];\nif (pair == null) return null;\nreturn pair.val;\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\npublic void put(int key, String val)\n{\nEntry pair = new Entry(key, val);\nint index = hashFunc(key);\nbuckets[index] = pair;\n}\n/* \u5220\u9664\u64cd\u4f5c */\npublic void remove(int key)\n{\nint index = hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nbuckets[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic List<Entry> entrySet()\n{\nList<Entry> entrySet = new();\nforeach (Entry? pair in buckets)\n{\nif (pair != null)\nentrySet.Add(pair);\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic List<int> keySet()\n{\nList<int> keySet = new();\nforeach (Entry? pair in buckets)\n{\nif (pair != null)\nkeySet.Add(pair.key);\n}\nreturn keySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\npublic List<String> valueSet()\n{\nList<String> valueSet = new();\nforeach (Entry? pair in buckets)\n{\nif (pair != null)\nvalueSet.Add(pair.val);\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic void print()\n{\nforeach (Entry kv in entrySet())\n{\nConsole.WriteLine(kv.key + \" -> \" + kv.val);\n}\n}\n}\n
array_hash_map.swift
/* \u952e\u503c\u5bf9 int->String */\nclass Entry {\nvar key: Int\nvar val: String\ninit(key: Int, val: String) {\nself.key = key\nself.val = val\n}\n}\n/* \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\nprivate var buckets: [Entry?] = []\ninit() {\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nfor _ in 0 ..< 100 {\nbuckets.append(nil)\n}\n}\n/* \u54c8\u5e0c\u51fd\u6570 */\nprivate func hashFunc(key: Int) -> Int {\nlet index = key % 100\nreturn index\n}\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc get(key: Int) -> String? {\nlet index = hashFunc(key: key)\nlet pair = buckets[index]\nreturn pair?.val\n}\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc put(key: Int, val: String) {\nlet pair = Entry(key: key, val: val)\nlet index = hashFunc(key: key)\nbuckets[index] = pair\n}\n/* \u5220\u9664\u64cd\u4f5c */\nfunc remove(key: Int) {\nlet index = hashFunc(key: key)\n// \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\nbuckets[index] = nil\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nfunc entrySet() -> [Entry] {\nvar entrySet: [Entry] = []\nfor pair in buckets {\nif let pair = pair {\nentrySet.append(pair)\n}\n}\nreturn entrySet\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc keySet() -> [Int] {\nvar keySet: [Int] = []\nfor pair in buckets {\nif let pair = pair {\nkeySet.append(pair.key)\n}\n}\nreturn keySet\n}\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc valueSet() -> [String] {\nvar valueSet: [String] = []\nfor pair in buckets {\nif let pair = pair {\nvalueSet.append(pair.val)\n}\n}\nreturn valueSet\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc print() {\nfor entry in entrySet() {\nSwift.print(\"\\(entry.key) -> \\(entry.val)\")\n}\n}\n}\n
array_hash_map.zig
// \u952e\u503c\u5bf9 int->String\nconst Entry = struct {\nkey: usize = undefined,\nval: []const u8 = undefined,\npub fn init(key: usize, val: []const u8) Entry {\nreturn Entry {\n.key = key,\n.val = val,\n};\n}\n};\n// \u57fa\u4e8e\u6570\u7ec4\u7b80\u6613\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\nreturn struct {\nbuckets: ?std.ArrayList(?T) = null,\nmem_allocator: std.mem.Allocator = undefined,\nconst Self = @This();\n// \u6784\u9020\u65b9\u6cd5\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nself.mem_allocator = allocator;\n// \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\nself.buckets = std.ArrayList(?T).init(self.mem_allocator);\nvar i: i32 = 0;\nwhile (i < 100) : (i += 1) {\ntry self.buckets.?.append(null);\n}\n}\n// \u6790\u6784\u65b9\u6cd5\npub fn deinit(self: *Self) void {\nif (self.buckets != null) self.buckets.?.deinit();\n}\n// \u54c8\u5e0c\u51fd\u6570\nfn hashFunc(key: usize) usize {\nvar index = key % 100;\nreturn index;\n}\n// \u67e5\u8be2\u64cd\u4f5c\npub fn get(self: *Self, key: usize) []const u8 {\nvar index = hashFunc(key);\nvar pair = self.buckets.?.items[index];\nreturn pair.?.val;\n}\n// \u6dfb\u52a0\u64cd\u4f5c\npub fn put(self: *Self, key: usize, val: []const u8) !void {\nvar pair = Entry.init(key, val);\nvar index = hashFunc(key);\nself.buckets.?.items[index] = pair;\n}\n// \u5220\u9664\u64cd\u4f5c\npub fn remove(self: *Self, key: usize) !void {\nvar index = hashFunc(key);\n// \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\nself.buckets.?.items[index] = null;\n}       // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\npub fn entrySet(self: *Self) !*std.ArrayList(T) {\nvar entry_set = std.ArrayList(T).init(self.mem_allocator);\nfor (self.buckets.?.items) |item| {\nif (item == null) continue;\ntry entry_set.append(item.?);\n}\nreturn &entry_set;\n}  // \u83b7\u53d6\u6240\u6709\u952e\npub fn keySet(self: *Self) !*std.ArrayList(usize) {\nvar key_set = std.ArrayList(usize).init(self.mem_allocator);\nfor (self.buckets.?.items) |item| {\nif (item == null) continue;\ntry key_set.append(item.?.key);\n}\nreturn &key_set;\n}  // \u83b7\u53d6\u6240\u6709\u503c\npub fn valueSet(self: *Self) !*std.ArrayList([]const u8) {\nvar value_set = std.ArrayList([]const u8).init(self.mem_allocator);\nfor (self.buckets.?.items) |item| {\nif (item == null) continue;\ntry value_set.append(item.?.val);\n}\nreturn &value_set;\n}\n// \u6253\u5370\u54c8\u5e0c\u8868\npub fn print(self: *Self) !void {\nvar entry_set = try self.entrySet();\ndefer entry_set.deinit();\nfor (entry_set.items) |item| {\nstd.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n}\n}\n};\n}\n
"},{"location":"chapter_hashing/hash_map/#713","title":"7.1.3. \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u5df2\u7ecf\u6ce8\u610f\u5230\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570 \\(f(x) = x % 100\\) \u53ef\u80fd\u65e0\u6cd5\u6b63\u5e38\u5de5\u4f5c\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5f53\u8f93\u5165\u7684 key \u540e\u4e24\u4f4d\u76f8\u540c\u65f6\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u7ed3\u679c\u4e5f\u4f1a\u76f8\u540c\uff0c\u4ece\u800c\u6307\u5411\u540c\u4e00\u4e2a value \u3002\u4f8b\u5982\uff0c\u67e5\u8be2\u5b66\u53f7\u4e3a \\(12836\\) \u548c \\(20336\\) \u7684\u4e24\u4e2a\u5b66\u751f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\uff1a

\\[ f(12836) = f(20336) = 36 \\]

\u8fd9\u4e24\u4e2a\u5b66\u53f7\u6307\u5411\u4e86\u540c\u4e00\u4e2a\u59d3\u540d\uff0c\u8fd9\u663e\u7136\u662f\u9519\u8bef\u7684\u3002\u6211\u4eec\u628a\u8fd9\u79cd\u60c5\u51b5\u79f0\u4e3a\u300c\u54c8\u5e0c\u51b2\u7a81 Hash Collision\u300d\u3002\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u8ba8\u8bba\u5982\u4f55\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u7684\u95ee\u9898\u3002

Fig. \u54c8\u5e0c\u51b2\u7a81\u793a\u4f8b

\u7efc\u4e0a\u6240\u8ff0\uff0c\u4e00\u4e2a\u4f18\u79c0\u7684\u54c8\u5e0c\u51fd\u6570\u5e94\u5177\u5907\u4ee5\u4e0b\u7279\u6027\uff1a

  • \u5c3d\u53ef\u80fd\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\uff1b
  • \u67e5\u8be2\u6548\u7387\u9ad8\u4e14\u7a33\u5b9a\uff0c\u80fd\u591f\u5728\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\u8fbe\u5230 \\(O(1)\\) \u65f6\u95f4\u590d\u6742\u5ea6\uff1b
  • \u8f83\u9ad8\u7684\u7a7a\u95f4\u5229\u7528\u7387\uff0c\u5373\u4f7f\u201c\u952e\u503c\u5bf9\u5360\u7528\u7a7a\u95f4 / \u54c8\u5e0c\u8868\u603b\u5360\u7528\u7a7a\u95f4\u201d\u6bd4\u4f8b\u6700\u5927\u5316\uff1b
"},{"location":"chapter_hashing/summary/","title":"7.3. \u00a0 \u5c0f\u7ed3","text":"
  • \u54c8\u5e0c\u8868\u80fd\u591f\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u5c06\u952e key \u6620\u5c04\u5230\u503c value\uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
  • \u5e38\u89c1\u7684\u54c8\u5e0c\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8be2\u3001\u6dfb\u52a0\u4e0e\u5220\u9664\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u503c\u5bf9\u7b49\u3002
  • \u54c8\u5e0c\u51fd\u6570\u5c06 key \u6620\u5c04\u4e3a\u6570\u7ec4\u7d22\u5f15\uff08\u6876\uff09\uff0c\u4ee5\u4fbf\u8bbf\u95ee\u5bf9\u5e94\u7684\u503c value \u3002
  • \u4e24\u4e2a\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u540e\u5f97\u5230\u76f8\u540c\u7684\u7d22\u5f15\uff0c\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u51fa\u9519\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\u3002
  • \u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\u7684\u65b9\u6cd5\u4e3b\u8981\u6709\u6269\u5bb9\u54c8\u5e0c\u8868\u548c\u4f18\u5316\u54c8\u5e0c\u8868\u7684\u8868\u793a\u65b9\u6cd5\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\u4e0e\u6570\u7ec4\u6269\u5bb9\u7c7b\u4f3c\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u64cd\u4f5c\u4e5f\u4f1a\u4ea7\u751f\u8f83\u5927\u7684\u5f00\u9500\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\uff0c\u4ece\u800c\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u3002\u7136\u800c\uff0c\u8fc7\u957f\u7684\u94fe\u8868\u4f1a\u964d\u4f4e\u67e5\u8be2\u6548\u7387\uff0c\u53ef\u4ee5\u901a\u8fc7\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a AVL \u6811\u6216\u7ea2\u9ed1\u6811\u6765\u6539\u5584\u3002
  • \u5f00\u653e\u5bfb\u5740\u901a\u8fc7\u591a\u6b21\u63a2\u6d4b\u6765\u89e3\u51b3\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\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\u5bf9\u7ebf\u6027\u63a2\u6d4b\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\u7b56\u7565\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u94fe\u5f0f\u5730\u5740\uff0c\u800c Python \u7684 Dict \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002
"},{"location":"chapter_heap/build_heap/","title":"9.2. \u00a0 \u5efa\u5806\u64cd\u4f5c *","text":"

\u5982\u679c\u6211\u4eec\u60f3\u8981\u6839\u636e\u8f93\u5165\u5217\u8868\u751f\u6210\u4e00\u4e2a\u5806\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u88ab\u79f0\u4e3a\u300c\u5efa\u5806\u300d\u3002

"},{"location":"chapter_heap/build_heap/#921","title":"9.2.1. \u00a0 \u501f\u52a9\u5165\u5806\u65b9\u6cd5\u5b9e\u73b0","text":"

\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u501f\u52a9\u201c\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\uff0c\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u7a7a\u5806\uff0c\u7136\u540e\u5c06\u5217\u8868\u5143\u7d20\u4f9d\u6b21\u6dfb\u52a0\u5230\u5806\u4e2d\u3002

\u8bbe\u5143\u7d20\u6570\u91cf\u4e3a \\(n\\) \uff0c\u5219\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u5165\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u5728\u4f9d\u6b21\u6dfb\u52a0\u5143\u7d20\u65f6\uff0c\u5806\u7684\u5e73\u5747\u957f\u5ea6\u4e3a \\(\\frac{n}{2}\\) \uff0c\u56e0\u6b64\u8be5\u65b9\u6cd5\u7684\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

"},{"location":"chapter_heap/build_heap/#922","title":"9.2.2. \u00a0 \u57fa\u4e8e\u5806\u5316\u64cd\u4f5c\u5b9e\u73b0","text":"

\u6709\u8da3\u7684\u662f\uff0c\u5b58\u5728\u4e00\u79cd\u66f4\u9ad8\u6548\u7684\u5efa\u5806\u65b9\u6cd5\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u4ec5\u4e3a \\(O(n)\\) \u3002\u6211\u4eec\u5148\u5c06\u5217\u8868\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u5230\u5806\u4e2d\uff0c\u7136\u540e\u8fed\u4ee3\u5730\u5bf9\u5404\u4e2a\u8282\u70b9\u6267\u884c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u3002\u5f53\u7136\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u5bf9\u53f6\u8282\u70b9\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5b83\u4eec\u6ca1\u6709\u5b50\u8282\u70b9\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nmaxHeap = new ArrayList<>(nums);\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = parent(size() - 1); i >= 0; i--) {\nsiftDown(i);\n}\n}\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\nmaxHeap = nums;\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = parent(size() - 1); i >= 0; i--) {\nsiftDown(i);\n}\n}\n
my_heap.py
def __init__(self, nums: list[int]):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n# \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\nself.max_heap = nums\n# \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in range(self.parent(self.size() - 1), -1, -1):\nself.sift_down(i)\n
my_heap.go
/* \u6784\u9020\u65b9\u6cd5\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\nh := &maxHeap{data: nums}\nfor i := len(h.data) - 1; i >= 0; i-- {\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nh.siftDown(i)\n}\nreturn h\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\nthis.#maxHeap = nums === undefined ? [] : [...nums];\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (let i = this.#parent(this.size() - 1); i >= 0; i--) {\nthis.#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\nthis.maxHeap = nums === undefined ? [] : [...nums];\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (let i = this.parent(this.size() - 1); i >= 0; i--) {\nthis.siftDown(i);\n}\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\nmaxHeap *h = (maxHeap *)malloc(sizeof(maxHeap));\nh->size = size;\nmemcpy(h->data, nums, size * sizeof(int));\nfor (int i = size - 1; i >= 0; i--) {\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nsiftDown(h, i);\n}\nreturn h;\n}\n
my_heap.cs
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums)\n{\n// \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\nmaxHeap = new List<int>(nums);\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nvar size = parent(this.size() - 1);\nfor (int i = size; i >= 0; i--)\n{\nsiftDown(i);\n}\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\nmaxHeap = nums\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in stride(from: parent(i: size() - 1), through: 0, by: -1) {\nsiftDown(i: i)\n}\n}\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 {\nif (self.max_heap != null) return;\nself.max_heap = std.ArrayList(T).init(allocator);\n// \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\ntry self.max_heap.?.appendSlice(nums);\n// \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nvar i: usize = parent(self.size() - 1) + 1;\nwhile (i > 0) : (i -= 1) {\ntry self.siftDown(i - 1);\n}\n}\n
"},{"location":"chapter_heap/build_heap/#923","title":"9.2.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u4e3a\u4ec0\u4e48\u7b2c\u4e8c\u79cd\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \uff1f\u6211\u4eec\u6765\u5c55\u5f00\u63a8\u7b97\u4e00\u4e0b\u3002

  • \u5b8c\u5168\u4e8c\u53c9\u6811\u4e2d\uff0c\u8bbe\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \uff0c\u5219\u53f6\u8282\u70b9\u6570\u91cf\u4e3a \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u4e3a\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\uff0c\u5728\u6392\u9664\u53f6\u8282\u70b9\u540e\uff0c\u9700\u8981\u5806\u5316\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\((n - 1)/2\\) \uff0c\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b
  • \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 \\(O(\\log n)\\) \uff1b

\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\u7136\u800c\uff0c\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\u7279\u6027\u3002

\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8fdb\u884c\u66f4\u4e3a\u8be6\u7ec6\u7684\u8ba1\u7b97\u3002\u4e3a\u4e86\u51cf\u5c0f\u8ba1\u7b97\u96be\u5ea6\uff0c\u6211\u4eec\u5047\u8bbe\u6811\u662f\u4e00\u4e2a\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff0c\u8be5\u5047\u8bbe\u4e0d\u4f1a\u5f71\u54cd\u8ba1\u7b97\u7ed3\u679c\u7684\u6b63\u786e\u6027\u3002\u8bbe\u4e8c\u53c9\u6811\uff08\u5373\u5806\uff09\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u6811\u9ad8\u5ea6\u4e3a \\(h\\) \u3002\u4e0a\u6587\u63d0\u5230\uff0c\u8282\u70b9\u5806\u5316\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

Fig. \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u5404\u5c42\u8282\u70b9\u6570\u91cf

\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5404\u5c42\u7684\u201c\u8282\u70b9\u6570\u91cf \\(\\times\\) \u8282\u70b9\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u4ece\u800c\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) + \\cdots + 2^{(h-1)}\\times1 \\]

\u5316\u7b80\u4e0a\u5f0f\u9700\u8981\u501f\u52a9\u4e2d\u5b66\u7684\u6570\u5217\u77e5\u8bc6\uff0c\u5148\u5bf9 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230

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

\u4f7f\u7528\u9519\u4f4d\u76f8\u51cf\u6cd5\uff0c\u4ee4\u4e0b\u5f0f \\(2 T(h)\\) \u51cf\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\cdots + 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

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

\u8fdb\u4e00\u6b65\u5730\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":"9.1. \u00a0 \u5806","text":"

\u300c\u5806 Heap\u300d\u662f\u4e00\u79cd\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u53ef\u5206\u4e3a\u4e24\u79cd\u7c7b\u578b\uff1a

  • \u300c\u5927\u9876\u5806 Max Heap\u300d\uff0c\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\geq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\uff1b
  • \u300c\u5c0f\u9876\u5806 Min Heap\u300d\uff0c\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\leq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\uff1b

Fig. \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\uff1a

  • \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\u300c\u5806\u9876\u300d\uff0c\u5c06\u5e95\u5c42\u6700\u9760\u53f3\u7684\u8282\u70b9\u79f0\u4e3a\u300c\u5806\u5e95\u300d\u3002
  • \u5bf9\u4e8e\u5927\u9876\u5806\uff08\u5c0f\u9876\u5806\uff09\uff0c\u5806\u9876\u5143\u7d20\uff08\u5373\u6839\u8282\u70b9\uff09\u7684\u503c\u5206\u522b\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
"},{"location":"chapter_heap/heap/#911","title":"9.1.1. \u00a0 \u5806\u5e38\u7528\u64cd\u4f5c","text":"

\u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u662f\u300c\u4f18\u5148\u961f\u5217 Priority Queue\u300d\uff0c\u8fd9\u662f\u4e00\u79cd\u62bd\u8c61\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\u4f5c\u5b9e\u73b0\u4f18\u5148\u961f\u5217\uff0c\u5927\u9876\u5806\u76f8\u5f53\u4e8e\u5143\u7d20\u6309\u4ece\u5927\u5230\u5c0f\u987a\u5e8f\u51fa\u961f\u7684\u4f18\u5148\u961f\u5217\u3002\u4ece\u4f7f\u7528\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u300c\u4f18\u5148\u961f\u5217\u300d\u548c\u300c\u5806\u300d\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\u4f7f\u7528\u300c\u5806\u300d\u6765\u547d\u540d\u3002

\u5806\u7684\u5e38\u7528\u64cd\u4f5c\u89c1\u4e0b\u8868\uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

\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\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

Tip

\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\u4fee\u6539 Comparator \u6765\u5b9e\u73b0\u201c\u5c0f\u9876\u5806\u201d\u4e0e\u201c\u5927\u9876\u5806\u201d\u4e4b\u95f4\u7684\u8f6c\u6362\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\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 = heap.poll();  // 5\npeek = heap.poll();  // 4\npeek = heap.poll();  // 3\npeek = heap.poll();  // 2\npeek = heap.poll();  // 1\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\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/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\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/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\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.py
# \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\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# \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# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\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# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: List[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\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// 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// 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\nlast := (*h)[len(*h)-1]\n*h = (*h)[:len(*h)-1]\nreturn last\n}\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\nreturn len(*h)\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\nreturn (*h)[i].(int) > (*h)[j].(int)\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// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\nreturn (*h)[0]\n}\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nmaxHeap := &intHeap{}\nheap.Init(maxHeap)\n/* \u5143\u7d20\u5165\u5806 */\n// \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\nheap.Push(maxHeap, 1)\nheap.Push(maxHeap, 3)\nheap.Push(maxHeap, 2)\nheap.Push(maxHeap, 4)\nheap.Push(maxHeap, 5)\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\ntop := maxHeap.Top()\nfmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\nheap.Pop(maxHeap) // 5\nheap.Pop(maxHeap) // 4\nheap.Pop(maxHeap) // 3\nheap.Pop(maxHeap) // 2\nheap.Pop(maxHeap) // 1\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nsize := len(*maxHeap)\nfmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(*maxHeap) == 0\nfmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.cs
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new PriorityQueue<int, int>();\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 PriorityQueue<int, int>(Comparer<int>.Create((x, y) => y - x));\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/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\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/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>(new List<(int, int)> { (1, 1), (3, 3), (2, 2), (5, 5), (4, 4), });\n
heap.swift
// Swift \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.zig
\n
"},{"location":"chapter_heap/heap/#912","title":"9.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\u53d6\u9006\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":"\u5806\u7684\u5b58\u50a8\u4e0e\u8868\u793a","text":"

\u6211\u4eec\u5728\u4e8c\u53c9\u6811\u7ae0\u8282\u4e2d\u5b66\u4e60\u5230\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\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

\u5177\u4f53\u800c\u8a00\uff0c\u7ed9\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 2\\) \uff0c\u7236\u8282\u70b9\u7d22\u5f15\u4e3a \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u53d6\u6574\uff09\u3002\u5f53\u7d22\u5f15\u8d8a\u754c\u65f6\uff0c\u8868\u793a\u7a7a\u8282\u70b9\u6216\u8282\u70b9\u4e0d\u5b58\u5728\u3002

Fig. \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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(int i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(int i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(int i) {\nreturn (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cpp
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(int i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(int i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(int i) {\nreturn (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.py
def left(self, i: int) -> int:\n\"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\"\"\"\nreturn 2 * i + 1\ndef right(self, i: int) -> int:\n\"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\"\"\"\nreturn 2 * i + 2\ndef parent(self, i: int) -> int:\n\"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15\"\"\"\nreturn (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.go
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\nreturn 2*i + 1\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\nreturn 2*i + 2\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n// \u5411\u4e0b\u6574\u9664\nreturn (i - 1) / 2\n}\n
my_heap.js
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\n#left(i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\n#right(i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\n#parent(i) {\nreturn Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nleft(i: number): number {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nright(i: number): number {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nparent(i: number): number {\nreturn Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(maxHeap *h, int i) {\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(maxHeap *h, int i) {\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(maxHeap *h, int i) {\nreturn (i - 1) / 2;\n}\n
my_heap.cs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nint left(int i)\n{\nreturn 2 * i + 1;\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nint right(int i)\n{\nreturn 2 * i + 2;\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nint parent(int i)\n{\nreturn (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.swift
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n2 * i + 1\n}\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n2 * i + 2\n}\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n(i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.zig
// \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\nfn left(i: usize) usize {\nreturn 2 * i + 1;\n}\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\nfn right(i: usize) usize {\nreturn 2 * i + 2;\n}\n// \u83b7\u53d6\u7236\u8282\u70b9\u7d22\u5f15\nfn parent(i: usize) usize {\n// return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\nreturn @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#_2","title":"\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\nreturn maxHeap.get(0);\n}\n
my_heap.cpp
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\nreturn maxHeap[0];\n}\n
my_heap.py
def peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\nreturn self.max_heap[0]\n
my_heap.go
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\nreturn h.data[0]\n}\n
my_heap.js
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\nreturn this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\nreturn this.maxHeap[0];\n}\n
my_heap.c
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(maxHeap *h) {\nreturn h->data[0];\n}\n
my_heap.cs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek()\n{\nreturn maxHeap[0];\n}\n
my_heap.swift
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\nmaxHeap[0]\n}\n
my_heap.zig
// \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\nreturn self.max_heap.?.items[0];\n}  
"},{"location":"chapter_heap/heap/#_3","title":"\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\u3002\u56e0\u6b64\uff0c\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\u300c\u5806\u5316 Heapify\u300d\u3002

\u8003\u8651\u4ece\u5165\u5806\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u6267\u884c\u5806\u5316\u3002\u5177\u4f53\u6765\u8bf4\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\u9700\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

<1><2><3><4><5><6>

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.add(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.push_back(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || maxHeap[i] <= maxHeap[p])\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(maxHeap[i], maxHeap[p]);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.py
def push(self, val: int):\n\"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n# \u6dfb\u52a0\u8282\u70b9\nself.max_heap.append(val)\n# \u4ece\u5e95\u81f3\u9876\u5806\u5316\nself.sift_up(self.size() - 1)\ndef sift_up(self, i: int):\n\"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\nwhile True:\n# \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\np = self.parent(i)\n# \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif p < 0 or self.max_heap[i] <= self.max_heap[p]:\nbreak\n# \u4ea4\u6362\u4e24\u8282\u70b9\nself.swap(i, p)\n# \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p\n
my_heap.go
/* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n// \u6dfb\u52a0\u8282\u70b9\nh.data = append(h.data, val)\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nh.siftUp(len(h.data) - 1)\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\nfor true {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\np := h.parent(i)\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif p < 0 || h.data[i].(int) <= h.data[p].(int) {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nh.swap(i, p)\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p\n}\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806 */\npush(val) {\n// \u6dfb\u52a0\u8282\u70b9\nthis.#maxHeap.push(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nthis.#siftUp(this.size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nconst p = this.#parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.#swap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n// \u6dfb\u52a0\u8282\u70b9\nthis.maxHeap.push(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nthis.siftUp(this.size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nconst p = this.parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.swap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806 */\nvoid push(maxHeap *h, int val) {\n// \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\nif (h->size == MAX_SIZE) {\nprintf(\"heap is full!\");\nreturn;\n}\n// \u6dfb\u52a0\u8282\u70b9\nh->data[h->size] = val;\nh->size++;\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(h, h->size - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(maxHeap *h, int i) {\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(h, i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 || h->data[i] <= h->data[p]) {\nbreak;\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(h, i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val)\n{\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.Add(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(size() - 1);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i)\n{\nwhile (true)\n{\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nint p = parent(i);\n// \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\nif (p < 0 || maxHeap[i] <= maxHeap[p])\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n// \u6dfb\u52a0\u8282\u70b9\nmaxHeap.append(val)\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\nsiftUp(i: size() - 1)\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\nvar i = i\nwhile true {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nlet p = parent(i: i)\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif p < 0 || maxHeap[i] <= maxHeap[p] {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i: i, j: p)\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p\n}\n}\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n// \u6dfb\u52a0\u8282\u70b9\ntry self.max_heap.?.append(val);\n// \u4ece\u5e95\u81f3\u9876\u5806\u5316\ntry self.siftUp(self.size() - 1);\n}  // \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\nvar i = i_;\nwhile (true) {\n// \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\nvar p = parent(i);\n// \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u9700\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\nif (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\ntry self.swap(i, p);\n// \u5faa\u73af\u5411\u4e0a\u5806\u5316\ni = p;\n}\n}\n
"},{"location":"chapter_heap/heap/#_4","title":"\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\u4fee\u590d\u53d8\u5f97\u56f0\u96be\u3002\u4e3a\u4e86\u5c3d\u91cf\u51cf\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u53d8\u52a8\uff0c\u6211\u4eec\u91c7\u53d6\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9aa4\uff1a

  1. \u4ea4\u6362\u5806\u9876\u5143\u7d20\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u5373\u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff09\uff1b
  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\u5b9e\u9645\u4e0a\u5220\u9664\u7684\u662f\u539f\u6765\u7684\u5806\u9876\u5143\u7d20\uff09\uff1b
  3. \u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u6267\u884c\u5806\u5316\uff1b

\u987e\u540d\u601d\u4e49\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u7684\u64cd\u4f5c\u65b9\u5411\u4e0e\u4ece\u5e95\u81f3\u9876\u5806\u5316\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\uff1b\u7136\u540e\u5faa\u73af\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u9047\u5230\u65e0\u9700\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

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

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig my_heap.java
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n// \u5224\u7a7a\u5904\u7406\nif (isEmpty())\nthrow new EmptyStackException();\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(0, size() - 1);\n// \u5220\u9664\u8282\u70b9\nint val = maxHeap.remove(size() - 1);\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = left(i), r = right(i), ma = i;\nif (l < size() && maxHeap.get(l) > maxHeap.get(ma))\nma = l;\nif (r < size() && maxHeap.get(r) > maxHeap.get(ma))\nma = r;\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i)\nbreak;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n// \u5224\u7a7a\u5904\u7406\nif (empty()) {\nthrow out_of_range(\"\u5806\u4e3a\u7a7a\");\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(maxHeap[0], maxHeap[size() - 1]);\n// \u5220\u9664\u8282\u70b9\nmaxHeap.pop_back();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(0);\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = left(i), r = right(i), ma = i;\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (l < size() && maxHeap[l] > maxHeap[ma])\nma = l;\nif (r < size() && maxHeap[r] > maxHeap[ma])\nma = r;\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i)\nbreak;\nswap(maxHeap[i], maxHeap[ma]);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.py
def pop(self) -> int:\n\"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n# \u5224\u7a7a\u5904\u7406\nassert not self.is_empty()\n# \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nself.swap(0, self.size() - 1)\n# \u5220\u9664\u8282\u70b9\nval = self.max_heap.pop()\n# \u4ece\u9876\u81f3\u5e95\u5806\u5316\nself.sift_down(0)\n# \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val\ndef sift_down(self, i: int):\n\"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\nwhile True:\n# \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nl, r, ma = self.left(i), self.right(i), i\nif l < self.size() and self.max_heap[l] > self.max_heap[ma]:\nma = l\nif r < self.size() and self.max_heap[r] > self.max_heap[ma]:\nma = r\n# \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif ma == i:\nbreak\n# \u4ea4\u6362\u4e24\u8282\u70b9\nself.swap(i, ma)\n# \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n// \u5224\u7a7a\u5904\u7406\nif h.isEmpty() {\nfmt.Println(\"error\")\nreturn nil\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nh.swap(0, h.size()-1)\n// \u5220\u9664\u8282\u70b9\nval := h.data[len(h.data)-1]\nh.data = h.data[:len(h.data)-1]\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nh.siftDown(0)\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\nfor true {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\nl, r, max := h.left(i), h.right(i), i\nif l < h.size() && h.data[l].(int) > h.data[max].(int) {\nmax = l\n}\nif r < h.size() && h.data[r].(int) > h.data[max].(int) {\nmax = r\n}\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif max == i {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nh.swap(i, max)\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = max\n}\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806 */\npop() {\n// \u5224\u7a7a\u5904\u7406\nif (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nthis.#swap(0, this.size() - 1);\n// \u5220\u9664\u8282\u70b9\nconst val = this.#maxHeap.pop();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nthis.#siftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nconst l = this.#left(i),\nr = this.#right(i);\nlet ma = i;\nif (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\nif (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\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.#swap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n// \u5224\u7a7a\u5904\u7406\nif (this.isEmpty()) throw new RangeError('Heap is empty.');\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nthis.swap(0, this.size() - 1);\n// \u5220\u9664\u8282\u70b9\nconst val = this.maxHeap.pop();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nthis.siftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nconst l = this.left(i),\nr = this.right(i);\nlet ma = i;\nif (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\nif (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\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nthis.swap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806 */\nint pop(maxHeap *h) {\n// \u5224\u7a7a\u5904\u7406\nif (isEmpty(h)) {\nprintf(\"heap is empty!\");\nreturn INT_MAX;\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(h, 0, size(h) - 1);\n// \u5220\u9664\u8282\u70b9\nint val = h->data[h->size - 1];\nh->size--;\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(h, 0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(maxHeap *h, int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\nint l = left(h, i);\nint r = right(h, i);\nint max = i;\nif (l < size(h) && h->data[l] > h->data[max]) {\nmax = l;\n}\nif (r < size(h) && h->data[r] > h->data[max]) {\nmax = r;\n}\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (max == i) {\nbreak;\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(h, i, max);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = max;\n}\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806 */\nint pop()\n{\n// \u5224\u7a7a\u5904\u7406\nif (isEmpty())\nthrow new IndexOutOfRangeException();\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(0, size() - 1);\n// \u5220\u9664\u8282\u70b9\nint val = maxHeap.Last();\nmaxHeap.RemoveAt(size() - 1);\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i)\n{\nwhile (true)\n{\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = left(i), r = right(i), ma = i;\nif (l < size() && maxHeap[l] > maxHeap[ma])\nma = l;\nif (r < size() && maxHeap[r] > maxHeap[ma])\nma = r;\n// \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n// \u5224\u7a7a\u5904\u7406\nif isEmpty() {\nfatalError(\"\u5806\u4e3a\u7a7a\")\n}\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nswap(i: 0, j: size() - 1)\n// \u5220\u9664\u8282\u70b9\nlet val = maxHeap.remove(at: size() - 1)\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\nsiftDown(i: 0)\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val\n}\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\nvar i = i\nwhile true {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nlet l = left(i: i)\nlet r = right(i: i)\nvar ma = i\nif l < size(), maxHeap[l] > maxHeap[ma] {\nma = l\n}\nif r < size(), maxHeap[r] > maxHeap[ma] {\nma = r\n}\n// \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif ma == i {\nbreak\n}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(i: i, j: ma)\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n}\n}\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n// \u5224\u65ad\u5904\u7406\nif (self.isEmpty()) unreachable;\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\ntry self.swap(0, self.size() - 1);\n// \u5220\u9664\u8282\u70b9\nvar val = self.max_heap.?.pop();\n// \u4ece\u9876\u81f3\u5e95\u5806\u5316\ntry self.siftDown(0);\n// \u8fd4\u56de\u5806\u9876\u5143\u7d20\nreturn val;\n} // \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\nvar i = i_;\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nvar l = left(i);\nvar r = right(i);\nvar ma = i;\nif (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\nif (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\u9700\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\nif (ma == i) break;\n// \u4ea4\u6362\u4e24\u8282\u70b9\ntry self.swap(i, ma);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n
"},{"location":"chapter_heap/heap/#913","title":"9.1.3. \u00a0 \u5806\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\u4f9d\u6b21\u5c06\u6240\u6709\u5143\u7d20\u5f39\u51fa\uff0c\u4ece\u800c\u5f97\u5230\u4e00\u4e2a\u6709\u5e8f\u5e8f\u5217\u3002\u5f53\u7136\uff0c\u5806\u6392\u5e8f\u7684\u5b9e\u73b0\u65b9\u6cd5\u5e76\u4e0d\u9700\u8981\u5f39\u51fa\u5143\u7d20\uff0c\u800c\u662f\u6bcf\u8f6e\u5c06\u5806\u9876\u5143\u7d20\u4ea4\u6362\u81f3\u6570\u7ec4\u5c3e\u90e8\u5e76\u7f29\u5c0f\u5806\u7684\u957f\u5ea6\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":"9.3. \u00a0 \u5c0f\u7ed3","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
"},{"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\u4e8e\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\u5b9e\u9645\u4e0a\uff0c\u4f60\u5df2\u7ecf\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u5e76\u4e60\u60ef\u5c06\u4ed6\u4eec\u5e94\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\uff0c\u6211\u5c06\u4e3e\u4e24\u4e2a\u5177\u4f53\u4f8b\u5b50\u6765\u8bc1\u5b9e\u8fd9\u4e00\u70b9\u3002

\u4f8b\u4e00\uff1a\u7ec4\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

\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u79ef\u6728\u7684\u5404\u79cd\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u800c\u7ec4\u88c5\u8bf4\u660e\u4e66\u4e0a\u7684\u4e00\u7cfb\u5217\u6b65\u9aa4\u5219\u662f\u7b97\u6cd5\u3002

\u4f8b\u4e8c\uff1a\u67e5\u9605\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\u7684\u82f1\u6587\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\u8fd9\u6837\u64cd\u4f5c\uff1a

  1. \u7ffb\u5f00\u5b57\u5178\u7ea6\u4e00\u534a\u7684\u9875\u6570\uff0c\u67e5\u770b\u8be5\u9875\u9996\u5b57\u6bcd\u662f\u4ec0\u4e48\uff08\u5047\u8bbe\u4e3a \\(m\\) \uff09\uff1b
  2. \u7531\u4e8e\u5728\u82f1\u6587\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\uff1b
  3. \u4e0d\u65ad\u91cd\u590d\u6b65\u9aa4 1-2 \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u9875\u7801\u4e3a\u6b62\u3002
<1><2><3><4><5>

\u67e5\u9605\u5b57\u5178\u8fd9\u4e2a\u5c0f\u5b66\u751f\u5fc5\u5907\u6280\u80fd\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u8457\u540d\u7684\u300c\u4e8c\u5206\u67e5\u627e\u300d\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\u300c\u6570\u7ec4\u300d\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\u662f\u300c\u4e8c\u5206\u67e5\u627e\u300d\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\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

\u9605\u8bfb\u81f3\u6b64\uff0c\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\u90a3\u4e48\u592a\u597d\u4e86\uff01\u56e0\u4e3a\u8fd9\u6b63\u662f\u672c\u4e66\u5b58\u5728\u7684\u610f\u4e49\u3002\u63a5\u4e0b\u6765\uff0c\u8fd9\u672c\u4e66\u5c06\u4e00\u6b65\u6b65\u5f15\u5bfc\u4f60\u6df1\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\u4e60\u4e86\u8bb8\u591a\u201c\u7b97\u6cd5\u201d\uff0c\u7528\u4ee5\u89e3\u51b3\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u95ee\u9898\u3002
  • \u67e5\u9605\u5b57\u5178\u7684\u539f\u7406\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u67e5\u627e\u4f53\u73b0\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u7b97\u6cd5\u601d\u60f3\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\u5219\u662f\u53d1\u6325\u6570\u636e\u7ed3\u6784\u4f5c\u7528\u7684\u821e\u53f0\u3002
  • \u4e50\u9ad8\u79ef\u6728\u5bf9\u5e94\u4e8e\u6570\u636e\uff0c\u79ef\u6728\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u62fc\u88c5\u79ef\u6728\u7684\u6b65\u9aa4\u5219\u5bf9\u5e94\u7b97\u6cd5\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":"

\u300c\u7b97\u6cd5 Algorithm\u300d\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\u3002\u7b97\u6cd5\u5177\u6709\u4ee5\u4e0b\u7279\u6027\uff1a

  • \u95ee\u9898\u662f\u660e\u786e\u7684\uff0c\u5177\u6709\u6e05\u6670\u7684\u8f93\u5165\u548c\u8f93\u51fa\u5b9a\u4e49\u3002
  • \u89e3\u5177\u6709\u786e\u5b9a\u6027\uff0c\u5373\u7ed9\u5b9a\u76f8\u540c\u7684\u8f93\u5165\u65f6\uff0c\u8f93\u51fa\u59cb\u7ec8\u76f8\u540c\u3002
  • \u5177\u6709\u53ef\u884c\u6027\uff0c\u5728\u6709\u9650\u6b65\u9aa4\u3001\u65f6\u95f4\u548c\u5185\u5b58\u7a7a\u95f4\u4e0b\u53ef\u5b8c\u6210\u3002
"},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2. \u00a0 \u6570\u636e\u7ed3\u6784\u5b9a\u4e49","text":"

\u300c\u6570\u636e\u7ed3\u6784 Data Structure\u300d\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u4e3a\u4e86\u63d0\u9ad8\u6570\u636e\u5b58\u50a8\u548c\u64cd\u4f5c\u6027\u80fd\uff0c\u6570\u636e\u7ed3\u6784\u7684\u8bbe\u8ba1\u76ee\u6807\u5305\u62ec\uff1a

  • \u7a7a\u95f4\u5360\u7528\u5c3d\u91cf\u51cf\u5c11\uff0c\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\u5229\u4e8e\u7b97\u6cd5\u9ad8\u6548\u8fd0\u884c\u3002

\u6570\u636e\u7ed3\u6784\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5145\u6ee1\u6743\u8861\u7684\u8fc7\u7a0b\uff0c\u8fd9\u610f\u5473\u7740\u8981\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u4f18\u52bf\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u534f\u3002\u4f8b\u5982\uff0c\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\uff1b\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":"

\u300c\u6570\u636e\u7ed3\u6784\u300d\u4e0e\u300c\u7b97\u6cd5\u300d\u9ad8\u5ea6\u76f8\u5173\u4e14\u7d27\u5bc6\u7ed3\u5408\uff0c\u5177\u4f53\u8868\u73b0\u5728\uff1a

  • \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\u7528\u4e8e\u64cd\u4f5c\u6570\u636e\u7684\u65b9\u6cd5\u3002
  • \u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u7684\u821e\u53f0\u3002\u6570\u636e\u7ed3\u6784\u672c\u8eab\u4ec5\u5b58\u50a8\u6570\u636e\u4fe1\u606f\uff0c\u901a\u8fc7\u7ed3\u5408\u7b97\u6cd5\u624d\u80fd\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u3002
  • \u7279\u5b9a\u7b97\u6cd5\u901a\u5e38\u6709\u5bf9\u5e94\u6700\u4f18\u7684\u6570\u636e\u7ed3\u6784\u3002\u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u4e8e\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u8fdb\u884c\u5b9e\u73b0\uff0c\u4f46\u6700\u7ec8\u6267\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\u3002

Fig. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb

\u7c7b\u6bd4\u300cLEGO \u4e50\u9ad8\u300d\u548c\u300c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u300d\uff0c\u5219\u5bf9\u5e94\u5173\u7cfb\u5982\u4e0b\u8868\u6240\u793a\u3002

\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 LEGO \u4e50\u9ad8 \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\u6ce8\u610f\u7684\u662f\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u72ec\u7acb\u4e8e\u7f16\u7a0b\u8bed\u8a00\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u4e66\u5f97\u4ee5\u63d0\u4f9b\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\u300c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u300d\u7b80\u79f0\u4e3a\u300c\u7b97\u6cd5\u300d\u3002\u4f8b\u5982\uff0c\u4f17\u6240\u5468\u77e5\u7684 LeetCode \u7b97\u6cd5\u9898\u76ee\uff0c\u5b9e\u9645\u4e0a\u540c\u65f6\u8003\u5bdf\u4e86\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e24\u65b9\u9762\u7684\u77e5\u8bc6\u3002

"},{"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\u514d\u8d39\u3001\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\u3001\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\uff1b
  • \u7b97\u6cd5\u6e90\u4ee3\u7801\u7686\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u652f\u6301 Java, C++, Python, Go, JS, TS, C#, Swift, Zig \u7b49\u8bed\u8a00\uff1b
  • \u9f13\u52b1\u8bfb\u8005\u5728\u7ae0\u8282\u8ba8\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\uff1b
"},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1. \u00a0 \u8bfb\u8005\u5bf9\u8c61","text":"

\u82e5\u60a8\u662f\u300c\u7b97\u6cd5\u521d\u5b66\u8005\u300d\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\u8fd9\u672c\u4e66\u6b63\u662f\u4e3a\u60a8\u91cf\u8eab\u5b9a\u5236\uff01

\u5982\u679c\u60a8\u662f\u300c\u7b97\u6cd5\u8001\u624b\u300d\uff0c\u5df2\u7ecf\u79ef\u7d2f\u4e00\u5b9a\u5237\u9898\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u9898\u578b\uff0c\u90a3\u4e48\u672c\u4e66\u53ef\u52a9\u60a8\u56de\u987e\u4e0e\u68b3\u7406\u7b97\u6cd5\u77e5\u8bc6\u4f53\u7cfb\uff0c\u4ed3\u5e93\u6e90\u4ee3\u7801\u53ef\u4ee5\u88ab\u5f53\u4f5c\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u6216\u201c\u7b97\u6cd5\u5b57\u5178\u201d\u6765\u4f7f\u7528\u3002

\u82e5\u60a8\u662f\u300c\u7b97\u6cd5\u4e13\u5bb6\u300d\uff0c\u6211\u4eec\u671f\u5f85\u6536\u5230\u60a8\u7684\u5b9d\u8d35\u5efa\u8bae\uff0c\u6216\u8005\u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c\u3002

\u524d\u7f6e\u6761\u4ef6

\u60a8\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\u4e3b\u8981\u5185\u5bb9\u5305\u62ec\uff1a

  • \u590d\u6742\u5ea6\u5206\u6790\uff1a\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8bc4\u4ef7\u7ef4\u5ea6\u3001\u7b97\u6cd5\u6548\u7387\u7684\u8bc4\u4f30\u65b9\u6cd5\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5305\u62ec\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u793a\u4f8b\u7b49\u3002
  • \u6570\u636e\u7ed3\u6784\uff1a\u5e38\u89c1\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u5f62\u5f0f\u3001\u6570\u636e\u7ed3\u6784\u7684\u5206\u7c7b\u65b9\u6cd5\u3002\u6d89\u53ca\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u6563\u5217\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\uff0c\u5185\u5bb9\u5305\u62ec\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\u67e5\u627e\u7b97\u6cd5\u3001\u6392\u5e8f\u7b97\u6cd5\u3001\u641c\u7d22\u4e0e\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u5206\u6cbb\u7b97\u6cd5\u7b49\uff0c\u5185\u5bb9\u6db5\u76d6\u5b9a\u4e49\u3001\u5e94\u7528\u573a\u666f\u3001\u4f18\u7f3a\u70b9\u3001\u65f6\u7a7a\u6548\u7387\u3001\u5b9e\u73b0\u65b9\u6cd5\u3001\u793a\u4f8b\u9898\u76ee\u7b49\u3002

Fig. Hello \u7b97\u6cd5\u5185\u5bb9\u7ed3\u6784

"},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3. \u00a0 \u81f4\u8c22","text":"

\u5728\u672c\u4e66\u7684\u521b\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8bb8\u591a\u4eba\u7684\u5e2e\u52a9\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a

  • \u611f\u8c22\u6211\u5728\u516c\u53f8\u7684\u5bfc\u5e08\u674e\u6c50\u535a\u58eb\uff0c\u5728\u6df1\u5165\u4ea4\u8c08\u4e2d\u60a8\u9f13\u52b1\u6211\u201c\u884c\u52a8\u8d77\u6765\u201d\uff0c\u575a\u5b9a\u4e86\u6211\u5199\u8fd9\u672c\u4e66\u7684\u51b3\u5fc3\u3002
  • \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\u3002
  • \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 \"Hello World!\" \u7684\u7f8e\u597d\u56de\u5fc6\u3002
  • \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\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\u3002
  • \u611f\u8c22 @squidfunk \u63d0\u4f9b\u7684\u5199\u4f5c\u6392\u7248\u5efa\u8bae\uff0c\u4ee5\u53ca\u6770\u51fa\u7684\u5f00\u6e90\u9879\u76ee 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\u4eec\u7684\u6770\u51fa\u8d21\u732e\uff01

\u672c\u4e66\u5021\u5bfc\u201c\u624b\u8111\u5e76\u7528\u201d\u7684\u5b66\u4e60\u65b9\u6cd5\uff0c\u5728\u6b64\u65b9\u9762\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\u8457\u4f5c\uff0c\u5305\u62ec\u4e2d\u6587\u7248\u3001\u82f1\u6587\u7248\u3001\u674e\u6c90\u8001\u5e08 bilibili \u4e3b\u9875\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\u4e9b\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\u60a8\u901a\u8bfb\u672c\u8282\u5185\u5bb9\u3002

"},{"location":"chapter_preface/suggestions/#021","title":"0.2.1. \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\uff1a

  1. \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\u5185\u5bb9\u3002
  2. \u5237\u7b97\u6cd5\u9898\u3002\u5efa\u8bae\u4ece\u70ed\u95e8\u9898\u76ee\u5f00\u5237\uff0c\u5982\u5251\u6307 Offer\u548cLeetCode Hot 100\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-5 \u8f6e\u7684\u91cd\u590d\u540e\uff0c\u5c31\u80fd\u5c06\u5176\u7262\u8bb0\u5728\u5fc3\u3002
  3. \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

\u4f5c\u4e3a\u4e00\u672c\u5165\u95e8\u6559\u7a0b\uff0c\u672c\u4e66\u5185\u5bb9\u4e3b\u8981\u6db5\u76d6\u201c\u7b2c\u4e00\u9636\u6bb5\u201d\uff0c\u65e8\u5728\u5e2e\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u5f00\u7b2c\u4e8c\u548c\u7b2c\u4e09\u9636\u6bb5\u7684\u5b66\u4e60\u3002

Fig. \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf

"},{"location":"chapter_preface/suggestions/#022","title":"0.2.2. \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\u5efa\u8bae\u53ef\u4ee5\u5148\u8df3\u8fc7\u3002

\u6587\u7ae0\u4e2d\u7684\u91cd\u8981\u540d\u8bcd\u4f1a\u7528 \u300c \u300d \u62ec\u53f7\u6807\u6ce8\uff0c\u4f8b\u5982 \u300c\u6570\u7ec4 Array\u300d \u3002\u8bf7\u52a1\u5fc5\u8bb0\u4f4f\u8fd9\u4e9b\u540d\u8bcd\uff0c\u5305\u62ec\u82f1\u6587\u7ffb\u8bd1\uff0c\u4ee5\u4fbf\u540e\u7eed\u9605\u8bfb\u6587\u732e\u65f6\u4f7f\u7528\u3002

\u52a0\u7c97\u7684\u6587\u5b57 \u8868\u793a\u91cd\u70b9\u5185\u5bb9\u6216\u603b\u7ed3\u6027\u8bed\u53e5\uff0c\u8fd9\u7c7b\u6587\u5b57\u503c\u5f97\u7279\u522b\u5173\u6ce8\u3002

\u4e13\u6709\u540d\u8bcd\u548c\u6709\u7279\u6307\u542b\u4e49\u7684\u8bcd\u53e5\u4f1a\u4f7f\u7528 \u201c\u53cc\u5f15\u53f7\u201d \u6807\u6ce8\uff0c\u4ee5\u907f\u514d\u6b67\u4e49\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\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// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n// \u591a\u884c\n// \u6ce8\u91ca\n
"},{"location":"chapter_preface/suggestions/#023","title":"0.2.3. \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\u56e0\u6b64\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\u548c\u56fe\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5219\u4f5c\u4e3a\u52a8\u753b\u548c\u56fe\u7247\u7684\u89e3\u91ca\u4e0e\u8865\u5145\u3002

\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5982\u679c\u53d1\u73b0\u67d0\u6bb5\u5185\u5bb9\u63d0\u4f9b\u4e86\u52a8\u753b\u6216\u56fe\u89e3\uff0c\u5efa\u8bae\u4ee5\u56fe\u4e3a\u4e3b\u7ebf\uff0c\u4ee5\u6587\u5b57\uff08\u901a\u5e38\u4f4d\u4e8e\u56fe\u50cf\u4e0a\u65b9\uff09\u4e3a\u8f85\uff0c\u7efc\u5408\u4e24\u8005\u6765\u7406\u89e3\u5185\u5bb9\u3002

Fig. \u52a8\u753b\u56fe\u89e3\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#024","title":"0.2.4. \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

\u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\u5728GitHub \u4ed3\u5e93\uff0c\u6e90\u4ee3\u7801\u5305\u542b\u8be6\u7ec6\u6ce8\u91ca\uff0c\u5e76\u9644\u6709\u6d4b\u8bd5\u6837\u4f8b\uff0c\u53ef\u76f4\u63a5\u8fd0\u884c\u3002

\u5982\u679c\u5b66\u4e60\u65f6\u95f4\u6709\u9650\uff0c\u5efa\u8bae\u4f60\u81f3\u5c11\u901a\u8bfb\u5e76\u8fd0\u884c\u6240\u6709\u4ee3\u7801\u3002\u5982\u679c\u65f6\u95f4\u5145\u88d5\uff0c\u5efa\u8bae\u53c2\u7167\u4ee3\u7801\u81ea\u884c\u6572\u4e00\u904d\u3002\u4e0e\u4ec5\u9605\u8bfb\u4ee3\u7801\u76f8\u6bd4\uff0c\u7f16\u5199\u4ee3\u7801\u7684\u8fc7\u7a0b\u5f80\u5f80\u80fd\u5e26\u6765\u66f4\u591a\u6536\u83b7\u3002

Fig. \u8fd0\u884c\u4ee3\u7801\u793a\u4f8b

\u7b2c\u4e00\u6b65\uff1a\u5b89\u88c5\u672c\u5730\u7f16\u7a0b\u73af\u5883\u3002\u8bf7\u53c2\u7167\u9644\u5f55\u6559\u7a0b\u8fdb\u884c\u5b89\u88c5\uff0c\u5982\u679c\u5df2\u5b89\u88c5\u5219\u53ef\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002

\u7b2c\u4e8c\u6b65\uff1a\u4e0b\u8f7d\u4ee3\u7801\u4ed3\u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5 Git \uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u4ed3\u5e93\u3002

git clone https://github.com/krahets/hello-algo.git\n

\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u70b9\u51fb\u201cDownload ZIP\u201d\u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u538b\u7f29\u5305\uff0c\u7136\u540e\u5728\u672c\u5730\u89e3\u538b\u5373\u53ef\u3002

Fig. \u514b\u9686\u4ed3\u5e93\u4e0e\u4e0b\u8f7d\u4ee3\u7801

\u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u6e90\u4ee3\u7801\u3002\u5982\u679c\u4ee3\u7801\u5757\u9876\u90e8\u6807\u6709\u6587\u4ef6\u540d\u79f0\uff0c\u5219\u53ef\u4ee5\u5728\u4ed3\u5e93\u7684 codes \u6587\u4ef6\u5939\u4e2d\u627e\u5230\u76f8\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6\u3002\u6e90\u4ee3\u7801\u6587\u4ef6\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

Fig. \u4ee3\u7801\u5757\u4e0e\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6

"},{"location":"chapter_preface/suggestions/#025","title":"0.2.5. \u00a0 \u5728\u63d0\u95ee\u8ba8\u8bba\u4e2d\u5171\u540c\u6210\u957f","text":"

\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u8bf7\u4e0d\u8981\u201c\u60ef\u7740\u201d\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\u5176\u4ed6\u5c0f\u4f19\u4f34\u4eec\u5c06\u7aed\u8bda\u4e3a\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5728\u4e24\u5929\u5185\u5f97\u5230\u56de\u590d\u3002

\u540c\u65f6\uff0c\u4e5f\u5e0c\u671b\u60a8\u80fd\u5728\u8bc4\u8bba\u533a\u591a\u82b1\u4e9b\u65f6\u95f4\u3002\u4e00\u65b9\u9762\uff0c\u60a8\u53ef\u4ee5\u4e86\u89e3\u5927\u5bb6\u9047\u5230\u7684\u95ee\u9898\uff0c\u4ece\u800c\u67e5\u6f0f\u8865\u7f3a\uff0c\u8fd9\u5c06\u6709\u52a9\u4e8e\u6fc0\u53d1\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5e0c\u671b\u60a8\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u4f19\u4f34\u7684\u95ee\u9898\u3001\u5206\u4eab\u60a8\u7684\u89c1\u89e3\uff0c\u8ba9\u5927\u5bb6\u5171\u540c\u5b66\u4e60\u548c\u8fdb\u6b65\u3002

Fig. \u8bc4\u8bba\u533a\u793a\u4f8b

"},{"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\u5bf9\u4e8e\u5df2\u5177\u5907\u4e00\u5b9a\u79ef\u7d2f\u7684\u540c\u5b66\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u540c\u65f6\u6e90\u4ee3\u7801\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\u3001\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u7edd\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\u7c4d\u81f3\u5173\u91cd\u8981\uff0c\u6709\u52a9\u4e8e\u907f\u514d\u8d70\u5f2f\u8def\u3002
  • \u4e66\u5185\u7684\u52a8\u753b\u548c\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\uff0c\u9605\u8bfb\u65f6\u5e94\u7ed9\u4e88\u66f4\u591a\u5173\u6ce8\u3002
  • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\uff0c\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u6253\u4ee3\u7801\u3002
  • \u672c\u4e66\u8bbe\u6709\u8ba8\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\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] \u4e25\u851a\u654f. \u6570\u636e\u7ed3\u6784\uff08C \u8bed\u8a00\u7248\uff09.

[4] \u9093\u4fca\u8f89. \u6570\u636e\u7ed3\u6784\uff08C++ \u8bed\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

[5] \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.

[6] \u7a0b\u6770. \u5927\u8bdd\u6570\u636e\u7ed3\u6784.

[7] \u738b\u4e89. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u7f8e.

[8] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

[9] Aston Zhang, et al. Dive into Deep Learning.

"},{"location":"chapter_searching/replace_linear_by_hashing/","title":"12.2. \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565","text":"

\u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u65f6\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\u4ee5 LeetCode \u5168\u7ad9\u7b2c\u4e00\u9898 \u4e24\u6570\u4e4b\u548c \u4e3a\u4f8b\u3002

\u4e24\u6570\u4e4b\u548c

\u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u6574\u6570\u76ee\u6807\u503c target \uff0c\u8bf7\u4f60\u5728\u8be5\u6570\u7ec4\u4e2d\u627e\u51fa\u201c\u548c\u201d\u4e3a\u76ee\u6807\u503c target \u7684\u90a3\u4e24\u4e2a\u6574\u6570\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u4e0b\u6807\u3002

\u4f60\u53ef\u4ee5\u5047\u8bbe\u6bcf\u79cd\u8f93\u5165\u53ea\u4f1a\u5bf9\u5e94\u4e00\u4e2a\u7b54\u6848\u3002\u4f46\u662f\uff0c\u6570\u7ec4\u4e2d\u540c\u4e00\u4e2a\u5143\u7d20\u5728\u7b54\u6848\u91cc\u4e0d\u80fd\u91cd\u590d\u51fa\u73b0\u3002

\u4f60\u53ef\u4ee5\u6309\u4efb\u610f\u987a\u5e8f\u8fd4\u56de\u7b54\u6848\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1221","title":"12.2.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\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

\uff08\u56fe\uff09

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig leetcode_two_sum.java
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target) {\nint size = nums.length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (int i = 0; i < size - 1; i++) {\nfor (int j = i + 1; j < size; j++) {\nif (nums[i] + nums[j] == target)\nreturn new int[] { i, j };\n}\n}\nreturn new int[0];\n}\n
leetcode_two_sum.cpp
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\nint size = nums.size();\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (int i = 0; i < size - 1; i++) {\nfor (int j = i + 1; j < size; j++) {\nif (nums[i] + nums[j] == target)\nreturn {i, j};\n}\n}\nreturn {};\n}\n
leetcode_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 O(n^2)\nfor i in range(len(nums) - 1):\nfor j in range(i + 1, len(nums)):\nif nums[i] + nums[j] == target:\nreturn [i, j]\nreturn []\n
leetcode_two_sum.go
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums []int, target int) []int {\nsize := len(nums)\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor i := 0; i < size-1; i++ {\nfor j := i + 1; i < size; j++ {\nif nums[i]+nums[j] == target {\nreturn []int{i, j}\n}\n}\n}\nreturn nil\n}\n
leetcode_two_sum.js
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums, target) {\nconst n = nums.length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (let i = 0; i < n; i++) {\nfor (let j = i + 1; j < n; j++) {\nif (nums[i] + nums[j] === target) {\nreturn [i, j];\n}\n}\n}\nreturn [];\n}\n
leetcode_two_sum.ts
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\nconst n = nums.length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (let i = 0; i < n; i++) {\nfor (let j = i + 1; j < n; j++) {\nif (nums[i] + nums[j] === target) {\nreturn [i, j];\n}\n}\n}\nreturn [];\n}\n
leetcode_two_sum.c
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\nfor (int i = 0; i < numsSize; ++i) {\nfor (int j = i + 1; j < numsSize; ++j) {\nif (nums[i] + nums[j] == target) {\nint *res = malloc(sizeof(int) * 2);\nres[0] = i, res[1] = j;\n*returnSize = 2;\nreturn res;\n}\n}\n}\n*returnSize = 0;\nreturn NULL;\n}\n
leetcode_two_sum.cs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target)\n{\nint size = nums.Length;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nfor (int i = 0; i < size - 1; i++)\n{\nfor (int j = i + 1; j < size; j++)\n{\nif (nums[i] + nums[j] == target)\nreturn new int[] { i, j };\n}\n}\nreturn new int[0];\n}\n
leetcode_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 O(n^2)\nfor i in nums.indices.dropLast() {\nfor j in nums.indices.dropFirst(i + 1) {\nif nums[i] + nums[j] == target {\nreturn [i, j]\n}\n}\n}\nreturn [0]\n}\n
leetcode_two_sum.zig
// \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\nvar size: usize = nums.len;\nvar i: usize = 0;\n// \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n^2)\nwhile (i < size - 1) : (i += 1) {\nvar j = i + 1;\nwhile (j < size) : (j += 1) {\nif (nums[i] + nums[j] == target) {\nreturn [_]i32{@intCast(i32, i), @intCast(i32, j)};\n}\n}\n}\nreturn null;\n}\n

\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/#1222","title":"12.2.2. \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u5c06\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u6784\u5efa\u4e3a\u952e\u503c\u5bf9\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20 num \u5e76\u6267\u884c\uff1a

  1. \u5224\u65ad\u6570\u5b57 target - num \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\u5219\u76f4\u63a5\u8fd4\u56de\u8be5\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1b
  2. \u5c06\u5143\u7d20 num \u548c\u5176\u7d22\u5f15\u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\uff1b

\uff08\u56fe\uff09

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig leetcode_two_sum.java
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\nint size = nums.length;\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nMap<Integer, Integer> dic = new HashMap<>();\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (int i = 0; i < size; i++) {\nif (dic.containsKey(target - nums[i])) {\nreturn new int[] { dic.get(target - nums[i]), i };\n}\ndic.put(nums[i], i);\n}\nreturn new int[0];\n}\n
leetcode_two_sum.cpp
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\nint size = nums.size();\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nunordered_map<int, int> dic;\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (int i = 0; i < size; i++) {\nif (dic.find(target - nums[i]) != dic.end()) {\nreturn {dic[target - nums[i]], i};\n}\ndic.emplace(nums[i], i);\n}\nreturn {};\n}\n
leetcode_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 O(n)\ndic = {}\n# \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor i in range(len(nums)):\nif target - nums[i] in dic:\nreturn [dic[target - nums[i]], i]\ndic[nums[i]] = i\nreturn []\n
leetcode_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 O(n)\nhashTable := map[int]int{}\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor idx, val := range nums {\nif preIdx, ok := hashTable[target-val]; ok {\nreturn []int{preIdx, idx}\n}\nhashTable[val] = idx\n}\nreturn nil\n}\n
leetcode_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 O(n)\nlet m = {};\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (let i = 0; i < nums.length; i++) {\nif (m[nums[i]] !== undefined) {\nreturn [m[nums[i]], i];\n} else {\nm[target - nums[i]] = i;\n}\n}\nreturn [];\n}\n
leetcode_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 O(n)\nlet m: Map<number, number> = new Map();\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (let i = 0; i < nums.length; i++) {\nlet index = m.get(nums[i]);\nif (index !== undefined) {\nreturn [index, i];\n} else {\nm.set(target - nums[i], i);\n}\n}\nreturn [];\n}\n
leetcode_two_sum.c
/* \u54c8\u5e0c\u8868 */\nstruct hashTable {\nint key;\nint val;\nUT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n};\n/* \u54c8\u5e0c\u8868\u67e5\u8be2 */\nhashTable *find(hashTable *h, int key) {\nhashTable *tmp;\nHASH_FIND_INT(h, &key, tmp);\nreturn tmp;\n}\n/* \u54c8\u5e0c\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(hashTable *h, int key, int val) {\nhashTable *t = find(h, key);\nif (t == NULL) {\nhashTable *tmp = malloc(sizeof(hashTable));\ntmp->key = key, tmp->val = val;\nHASH_ADD_INT(h, key, tmp);\n} else {\nt->val = val;\n}\n}\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\nhashTable *hashtable = NULL;\nfor (int i = 0; i < numsSize; i++) {\nhashTable *t = find(hashtable, target - nums[i]);\nif (t != NULL) {\nint *res = malloc(sizeof(int) * 2);\nres[0] = t->val, res[1] = i;\n*returnSize = 2;\nreturn res;\n}\ninsert(hashtable, nums[i], i);\n}\n*returnSize = 0;\nreturn NULL;\n}\n
leetcode_two_sum.cs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target)\n{\nint size = nums.Length;\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nDictionary<int, int> dic = new();\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor (int i = 0; i < size; i++)\n{\nif (dic.ContainsKey(target - nums[i]))\n{\nreturn new int[] { dic[target - nums[i]], i };\n}\ndic.Add(nums[i], i);\n}\nreturn new int[0];\n}\n
leetcode_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 O(n)\nvar dic: [Int: Int] = [:]\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nfor i in nums.indices {\nif let j = dic[target - nums[i]] {\nreturn [j, i]\n}\ndic[nums[i]] = i\n}\nreturn [0]\n}\n
leetcode_two_sum.zig
// \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\nvar size: usize = nums.len;\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 O(n)\nvar dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\ndefer dic.deinit();\nvar i: usize = 0;\n// \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\nwhile (i < size) : (i += 1) {\nif (dic.contains(target - nums[i])) {\nreturn [_]i32{dic.get(target - nums[i]).?, @intCast(i32, i)};\n}\ntry dic.put(nums[i], @intCast(i32, i));\n}\nreturn null;\n}\n

\u6b64\u65b9\u6cd5\u901a\u8fc7\u54c8\u5e0c\u67e5\u627e\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u4f4e\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":"12.1. \u00a0 \u641c\u7d22\u7b97\u6cd5","text":"

\u300c\u641c\u7d22\u7b97\u6cd5 Searching Algorithm\u300d\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

\u6211\u4eec\u5df2\u7ecf\u5b66\u8fc7\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u65b9\u6cd5\uff0c\u4e5f\u5b66\u8fc7\u54c8\u5e0c\u8868\u3001\u4e8c\u53c9\u641c\u7d22\u6811\u7b49\u53ef\u7528\u4e8e\u5b9e\u73b0\u67e5\u8be2\u7684\u590d\u6742\u6570\u636e\u7ed3\u6784\u3002\u56e0\u6b64\uff0c\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\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/#1211","title":"12.1.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

  • \u300c\u7ebf\u6027\u641c\u7d22\u300d\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
  • \u300c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u300d\u548c\u300c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u300d\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\u662f\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\uff0c\u6cbf\u7740\u4e00\u6761\u8def\u5f84\u8d70\u5230\u5934\u4e3a\u6b62\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\u9700\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/#1212","title":"12.1.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

  • \u300c\u4e8c\u5206\u67e5\u627e\u300d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\u5b9e\u73b0\u9ad8\u6548\u67e5\u627e\uff0c\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002
  • \u300c\u54c8\u5e0c\u67e5\u627e\u300d\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
  • \u300c\u6811\u67e5\u627e\u300d\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\u652f\u3002

Note

\u81ea\u9002\u5e94\u641c\u7d22\u7b97\u6cd5\u5e38\u88ab\u79f0\u4e3a\u67e5\u627e\u7b97\u6cd5\uff0c\u4e3b\u8981\u5173\u6ce8\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u68c0\u7d22\u76ee\u6807\u5143\u7d20\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1213","title":"12.1.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\u5728\u8be5\u6570\u636e\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\u3002\u5404\u4e2a\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u4e0b\u56fe\u6240\u793a\u3002

Fig. \u591a\u79cd\u641c\u7d22\u7b56\u7565

\u4e0a\u8ff0\u51e0\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u4e0e\u7279\u6027\u5982\u4e0b\u8868\u6240\u793a\u3002

\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

\u9664\u4e86\u4ee5\u4e0a\u8868\u683c\u5185\u5bb9\uff0c\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\u9700\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\u79bb\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\u5f00\u9500\u3002
"},{"location":"chapter_searching/summary/","title":"12.3. \u00a0 \u5c0f\u7ed3","text":"
  • \u4e8c\u5206\u67e5\u627e\u4f9d\u8d56\u4e8e\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u5faa\u73af\u9010\u6b65\u7f29\u51cf\u4e00\u534a\u641c\u7d22\u533a\u95f4\u6765\u5b9e\u73b0\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\u9700\u5bf9\u6570\u636e\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\u5408\u5bf9\u67e5\u8be2\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u4e14\u65e0\u9700\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\u4f4e\u81f3 \\(O(1)\\) \u3002
"},{"location":"chapter_sorting/bubble_sort/","title":"11.2. \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

\u300c\u5192\u6ce1\u6392\u5e8f Bubble Sort\u300d\u7684\u5de5\u4f5c\u539f\u7406\u7c7b\u4f3c\u4e8e\u6ce1\u6ce1\u5728\u6c34\u4e2d\u7684\u6d6e\u52a8\u3002\u5728\u6c34\u4e2d\uff0c\u8f83\u5927\u7684\u6ce1\u6ce1\u4f1a\u6700\u5148\u6d6e\u5230\u6c34\u9762\u3002

\u300c\u5192\u6ce1\u64cd\u4f5c\u300d\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u4e86\u4e0a\u8ff0\u8fc7\u7a0b\uff0c\u5177\u4f53\u505a\u6cd5\u4e3a\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\u5b83\u4fe9\u3002\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6700\u5927\u7684\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u5230\u6570\u7ec4\u7684\u6700\u53f3\u7aef\u3002

\u5728\u5b8c\u6210\u4e00\u6b21\u5192\u6ce1\u64cd\u4f5c\u540e\uff0c\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u5df2\u4f4d\u4e8e\u6b63\u786e\u4f4d\u7f6e\uff0c\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\u3002

<1><2><3><4><5><6><7>

"},{"location":"chapter_sorting/bubble_sort/#1121","title":"11.2.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8bbe\u8f93\u5165\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6574\u4e2a\u5192\u6ce1\u6392\u5e8f\u7684\u6b65\u9aa4\u4e3a\uff1a

  1. \u5b8c\u6210\u7b2c\u4e00\u8f6e\u300c\u5192\u6ce1\u300d\u540e\uff0c\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u5df2\u4f4d\u4e8e\u6b63\u786e\u4f4d\u7f6e\uff0c\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\uff1b
  2. \u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u5192\u6ce1\u64cd\u4f5c\uff0c\u53ef\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\uff0c\u56e0\u800c\u5f85\u6392\u5e8f\u5143\u7d20\u53ea\u5269 \\(n - 2\\) \u4e2a\uff1b
  3. \u5982\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u5192\u6ce1\u64cd\u4f5c\uff0c\u6574\u4e2a\u6570\u7ec4\u4fbf\u5b8c\u6210\u6392\u5e8f\uff1b

Fig. \u5192\u6ce1\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\n}\n}\n}\n}\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n// \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\nswap(nums[j], nums[j + 1]);\n}\n}\n}\n}\n
bubble_sort.py
def bubble_sort(nums: list[int]) -> None:\n\"\"\"\u5192\u6ce1\u6392\u5e8f\"\"\"\nn: int = len(nums)\n# \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in range(n - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in range(i):\nif nums[j] > nums[j + 1]:\n# \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j + 1] = nums[j + 1], nums[j]\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j := 0; j < i; j++ {\nif nums[j] > nums[j+1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j+1] = nums[j+1], nums[j]\n}\n}\n}\n}\n
bubble_sort.js
/* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = 0; i < size - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < size - 1 - i; j++) {\nif (nums[j] > nums[j + 1]) {\nint temp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = temp;\n}\n}\n}\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums)\n{\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.Length - 1; i > 0; i--)\n{\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++)\n{\nif (nums[j] > nums[j + 1])\n{\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\n}\n}\n}\n}\n
bubble_sort.swift
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in stride(from: 0, to: i, by: 1) {\nif nums[j] > nums[j + 1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\n}\n}\n}\n}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nvar i: usize = nums.len - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nwhile (j < i) : (j += 1) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nvar tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\n}\n}\n}\n}\n
"},{"location":"chapter_sorting/bubble_sort/#1122","title":"11.2.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n^2)\\) \uff1a\u5404\u8f6e\u5192\u6ce1\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\) , \\(n - 2\\) , \\(\\cdots\\) , \\(2\\) , \\(1\\) \uff0c\u603b\u548c\u4e3a \\(\\frac{(n - 1) n}{2}\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002\u5728\u5f15\u5165\u4e0b\u6587\u7684 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \uff0c\u6240\u4ee5\u5b83\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u662f\u201c\u539f\u5730\u6392\u5e8f\u201d\u3002

\u7531\u4e8e\u5192\u6ce1\u64cd\u4f5c\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\uff0c\u56e0\u6b64\u5192\u6ce1\u6392\u5e8f\u662f\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/bubble_sort/#1123","title":"11.2.3. \u00a0 \u6548\u7387\u4f18\u5316","text":"

\u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u5192\u6ce1\u64cd\u4f5c\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\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.length - 1; i > 0; i--) {\nboolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag)\nbreak; // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n}\n}\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.size() - 1; i > 0; i--) {\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n// \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\nswap(nums[j], nums[j + 1]);\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag)\nbreak; // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n}\n}\n
bubble_sort.py
def bubble_sort_with_flag(nums: list[int]) -> None:\n\"\"\"\u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\"\"\"\nn: int = len(nums)\n# \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in range(n - 1, 0, -1):\nflag: bool = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n# \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j in range(i):\nif nums[j] > nums[j + 1]:\n# \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j + 1] = nums[j + 1], nums[j]\nflag = True  # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\nif not flag:\nbreak  # \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := len(nums) - 1; i > 0; i-- {\nflag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor j := 0; j < i; j++ {\nif nums[j] > nums[j+1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nnums[j], nums[j+1] = nums[j+1], nums[j]\nflag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif flag == false { // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\nbreak\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag) break; // \u6b64\u8f6e\u5192\u6ce1\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (let j = 0; j < i; j++) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag) break; // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = 0; i < size - 1; i++) {\nbool flag = false;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < size - 1 - i; j++) {\nif (nums[j] > nums[j + 1]) {\nint temp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = temp;\nflag = true;\n}\n}\nif (!flag)\nbreak;\n}\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(int[] nums)\n{\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor (int i = nums.Length - 1; i > 0; i--)\n{\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nfor (int j = 0; j < i; j++)\n{\nif (nums[j] > nums[j + 1])\n{\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nint tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true;  // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif (!flag) break;     // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\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\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\nvar flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\nfor j in stride(from: 0, to: i, by: 1) {\nif nums[j] > nums[j + 1] {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nlet tmp = nums[j]\nnums[j] = nums[j + 1]\nnums[j + 1] = tmp\nflag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n}\n}\nif !flag { // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\nbreak\n}\n}\n}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nvar i: usize = nums.len - 1;\nwhile (i > 0) : (i -= 1) {\nvar flag = false;   // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5192\u6ce1\u64cd\u4f5c\nwhile (j < i) : (j += 1) {\nif (nums[j] > nums[j + 1]) {\n// \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\nvar tmp = nums[j];\nnums[j] = nums[j + 1];\nnums[j + 1] = tmp;\nflag = true;\n}\n}\nif (!flag) break;   // \u6b64\u8f6e\u5192\u6ce1\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n}\n}\n
"},{"location":"chapter_sorting/bucket_sort/","title":"11.6. \u00a0 \u6876\u6392\u5e8f","text":"

\u524d\u8ff0\u7684\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\u6c34\u5e73\u3002

\u300c\u6876\u6392\u5e8f Bucket Sort\u300d\u662f\u5206\u6cbb\u601d\u60f3\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/#1161","title":"11.6.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8003\u8651\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u5143\u7d20\u662f\u8303\u56f4 \\([0, 1)\\) \u7684\u6d6e\u70b9\u6570\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a

  1. \u521d\u59cb\u5316 \\(k\\) \u4e2a\u6876\uff0c\u5c06 \\(n\\) \u4e2a\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u4e2a\u6876\u4e2d\uff1b
  2. \u5bf9\u6bcf\u4e2a\u6876\u5206\u522b\u6267\u884c\u6392\u5e8f\uff08\u672c\u6587\u91c7\u7528\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff09\uff1b
  3. \u6309\u7167\u6876\u7684\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\uff0c\u5408\u5e76\u7ed3\u679c\uff1b

Fig. \u6876\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint k = nums.length / 2;\nList<List<Float>> buckets = new ArrayList<>();\nfor (int i = 0; i < k; i++) {\nbuckets.add(new ArrayList<>());\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (float num : nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nint i = (int) num * k;\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets.get(i).add(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nCollections.sort(bucket);\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nint i = 0;\nfor (List<Float> bucket : buckets) {\nfor (float num : bucket) {\nnums[i++] = num;\n}\n}\n}\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\nint k = nums.size() / 2;\nvector<vector<float>> buckets(k);\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (float num : nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nint i = num * k;\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\nbuckets[i].push_back(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nsort(bucket.begin(), bucket.end());\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nint i = 0;\nfor (vector<float> &bucket : buckets) {\nfor (float num : bucket) {\nnums[i++] = num;\n}\n}\n}\n
bucket_sort.py
def bucket_sort(nums: list[float]) -> None:\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\nk = len(nums) // 2\nbuckets = [[] for _ in range(k)]\n# 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor num in nums:\n# \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\ni = int(num * k)\n# \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].append(num)\n# 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f5\nfor 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\nbucket.sort()\n# 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\ni = 0\nfor bucket in buckets:\nfor num in bucket:\nnums[i] = num\ni += 1\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\nk := len(nums) / 2\nbuckets := make([][]float64, k)\nfor i := 0; i < k; i++ {\nbuckets[i] = make([]float64, 0)\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor _, num := range nums {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\ni := int(num) * k\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i] = append(buckets[i], num)\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor 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\nsort.Float64s(buckets[i])\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\ni := 0\nfor _, bucket := range buckets {\nfor _, num := range bucket {\nnums[i] = num\ni++\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\nconst k = nums.length / 2;\nconst buckets = [];\nfor (let i = 0; i < k; i++) {\nbuckets.push([]);\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (const num of nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nconst i = Math.floor(num * k);\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].push(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nbucket.sort((a, b) => a - b);\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nlet i = 0;\nfor (const bucket of buckets) {\nfor (const num of bucket) {\nnums[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\nconst k = nums.length / 2;\nconst buckets: number[][] = [];\nfor (let i = 0; i < k; i++) {\nbuckets.push([]);\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor (const num of nums) {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nconst i = Math.floor(num * k);\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].push(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor (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\nbucket.sort((a, b) => a - b);\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nlet i = 0;\nfor (const bucket of buckets) {\nfor (const num of bucket) {\nnums[i++] = num;\n}\n}\n}\n
bucket_sort.c
[class]{}-[func]{bucketSort}\n
bucket_sort.cs
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums)\n{\n// \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\nint k = nums.Length / 2;\nList<List<float>> buckets = new List<List<float>>();\nfor (int i = 0; i < k; i++)\n{\nbuckets.Add(new List<float>());\n}\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nforeach (float num in nums)\n{\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nint i = (int)num * k;\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].Add(num);\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nforeach (List<float> bucket in buckets)\n{\n// \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\nbucket.Sort();\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nint j = 0;\nforeach (List<float> bucket in buckets)\n{\nforeach (float num in bucket)\n{\nnums[j++] = num;\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\nlet k = nums.count / 2\nvar buckets = (0 ..< k).map { _ in [Double]() }\n// 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\nfor num in nums {\n// \u8f93\u5165\u6570\u636e\u8303\u56f4 [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\nlet i = Int(num) * k\n// \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\nbuckets[i].append(num)\n}\n// 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\nfor 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\nbuckets[i].sort()\n}\n// 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\nvar i = nums.startIndex\nfor bucket in buckets {\nfor num in bucket {\nnums[i] = num\nnums.formIndex(after: &i)\n}\n}\n}\n
bucket_sort.zig
[class]{}-[func]{bucketSort}\n

\u6876\u6392\u5e8f\u7684\u9002\u7528\u573a\u666f\u662f\u4ec0\u4e48\uff1f

\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

"},{"location":"chapter_sorting/bucket_sort/#1162","title":"11.6.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(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 \\(n\\) \u4e2a\u6876\uff0c\u82b1\u8d39 \\(O(k)\\) \u65f6\u95f4\u3002

\u5728\u6700\u574f\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\uff0c\u56e0\u6b64\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n + k)\\) \uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u5c5e\u4e8e\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\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/#1163","title":"11.6.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 \u4efd\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\u4e2a\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\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u521b\u5efa\u4e00\u4e2a\u9012\u5f52\u6811\uff0c\u4f7f\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

Fig. \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\u4e0b\u56fe\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

Fig. \u6839\u636e\u6982\u7387\u5206\u5e03\u5212\u5206\u6876

"},{"location":"chapter_sorting/counting_sort/","title":"11.7. \u00a0 \u8ba1\u6570\u6392\u5e8f","text":"

\u300c\u8ba1\u6570\u6392\u5e8f Counting Sort\u300d\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/#1171","title":"11.7.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\u3002\u8ba1\u6570\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a

  1. \u904d\u5386\u6570\u7ec4\uff0c\u627e\u51fa\u6570\u7ec4\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 \uff1b
  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\u88ab\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u904d\u5386 counter \uff0c\u6839\u636e\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\uff0c\u5c06\u5b83\u4eec\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

Fig. \u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint m = 0;\nfor (int num : nums) {\nm = 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\nint[] counter = new int[m + 1];\nfor (int num : nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++) {\nfor (int j = 0; j < counter[num]; j++, i++) {\nnums[i] = num;\n}\n}\n}\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\nint m = 0;\nfor (int num : nums) {\nm = 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\nvector<int> counter(m + 1, 0);\nfor (int num : nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++) {\nfor (int j = 0; j < counter[num]; j++, i++) {\nnums[i] = num;\n}\n}\n}\n
counting_sort.py
def counting_sort_naive(nums: list[int]) -> None:\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\nm = 0\nfor num in nums:\nm = 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\ncounter = [0] * (m + 1)\nfor num in nums:\ncounter[num] += 1\n# 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\ni = 0\nfor num in range(m + 1):\nfor _ in range(counter[num]):\nnums[i] = num\ni += 1\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\nm := 0\nfor num := range nums {\nif num > m {\nm = 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\ncounter := make([]int, m+1)\nfor _, num := range nums {\ncounter[num]++\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nfor i, num := 0, 0; num < m+1; num++ {\nfor j := 0; j < counter[num]; j++ {\nnums[i] = num\ni++\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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter = new Array(m + 1).fill(0);\nfor (const num of nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nlet i = 0;\nfor (let num = 0; num < m + 1; num++) {\nfor (let j = 0; j < counter[num]; j++, i++) {\nnums[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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter: number[] = new Array<number>(m + 1).fill(0);\nfor (const num of nums) {\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nlet i = 0;\nfor (let num = 0; num < m + 1; num++) {\nfor (let j = 0; j < counter[num]; j++, i++) {\nnums[i] = num;\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\nint m = 0;\nfor (int i = 0; i < size; i++) {\nif (nums[i] > m) {\nm = 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\nint *counter = malloc(sizeof(int) * size);\nfor (int i = 0; i < size; i++) {\ncounter[nums[i]]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++) {\nfor (int j = 0; j < counter[num]; j++, i++) {\nnums[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{\n// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in nums)\n{\nm = 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\nint[] counter = new int[m + 1];\nforeach (int num in nums)\n{\ncounter[num]++;\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nint i = 0;\nfor (int num = 0; num < m + 1; num++)\n{\nfor (int j = 0; j < counter[num]; j++, i++)\n{\nnums[i] = num;\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\nlet 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\nvar counter = Array(repeating: 0, count: m + 1)\nfor num in nums {\ncounter[num] += 1\n}\n// 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\nvar i = 0\nfor num in stride(from: 0, to: m + 1, by: 1) {\nfor _ in stride(from: 0, to: counter[num], by: 1) {\nnums[i] = num\ni += 1\n}\n}\n}\n
counting_sort.zig
[class]{}-[func]{countingSortNaive}\n

\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\u662f\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/#1172","title":"11.7.2. \u00a0 \u5b8c\u6574\u5b9e\u73b0","text":"

\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u53d1\u73b0\uff0c\u5982\u679c\u8f93\u5165\u6570\u636e\u662f\u5bf9\u8c61\uff0c\u4e0a\u8ff0\u6b65\u9aa4 3. \u5c31\u5931\u6548\u4e86\u3002\u4f8b\u5982\uff0c\u8f93\u5165\u6570\u636e\u662f\u5546\u54c1\u5bf9\u8c61\uff0c\u6211\u4eec\u60f3\u8981\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\u300c\u524d\u7f00\u548c\u300d\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\uff0c\u5373

\\[ \\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\uff1a

  1. \u5c06 num \u586b\u5165\u6570\u7ec4 res \u7684\u7d22\u5f15 prefix[num] - 1 \u5904\uff1b
  2. \u4ee4\u524d\u7f00\u548c prefix[num] \u51cf\u5c0f \\(1\\) \uff0c\u4ece\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\uff1b

\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

<1><2><3><4><5><6><7><8>

\u8ba1\u6570\u6392\u5e8f\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint m = 0;\nfor (int num : nums) {\nm = 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\nint[] counter = new int[m + 1];\nfor (int num : nums) {\ncounter[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\nfor (int i = 0; i < m; i++) {\ncounter[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\nint n = nums.length;\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--) {\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (int i = 0; i < n; i++) {\nnums[i] = res[i];\n}\n}\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\nint m = 0;\nfor (int num : nums) {\nm = 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\nvector<int> counter(m + 1, 0);\nfor (int num : nums) {\ncounter[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\nfor (int i = 0; i < m; i++) {\ncounter[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\nint n = nums.size();\nvector<int> res(n);\nfor (int i = n - 1; i >= 0; i--) {\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nnums = res;\n}\n
counting_sort.py
def counting_sort(nums: list[int]) -> None:\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\nm = 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\ncounter = [0] * (m + 1)\nfor num in nums:\ncounter[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\nfor i in range(m):\ncounter[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\nn = len(nums)\nres = [0] * n\nfor i in range(n - 1, -1, -1):\nnum = nums[i]\nres[counter[num] - 1] = num  # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor i in range(n):\nnums[i] = res[i]\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\nm := 0\nfor num := range nums {\nif num > m {\nm = 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\ncounter := make([]int, m+1)\nfor _, num := range nums {\ncounter[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\nfor i := 0; i < m; i++ {\ncounter[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\nn := len(nums)\nres := make([]int, n)\nfor i := n - 1; i >= 0; i-- {\nnum := nums[i]\n// \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\nres[counter[num]-1] = num\n// \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\ncounter[num]--\n}\n// \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\ncopy(nums, res)\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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter = new Array(m + 1).fill(0);\nfor (const num of nums) {\ncounter[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\nfor (let i = 0; i < m; i++) {\ncounter[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\nconst n = nums.length;\nconst res = new Array(n);\nfor (let i = n - 1; i >= 0; i--) {\nconst num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (let i = 0; i < n; i++) {\nnums[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\nlet m = 0;\nfor (const num of nums) {\nm = 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\nconst counter: number[] = new Array<number>(m + 1).fill(0);\nfor (const num of nums) {\ncounter[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\nfor (let i = 0; i < m; i++) {\ncounter[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\nconst n = nums.length;\nconst res: number[] = new Array<number>(n);\nfor (let i = n - 1; i >= 0; i--) {\nconst num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (let i = 0; i < n; i++) {\nnums[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\nint m = 0;\nfor (int i = 0; i < size; i++) {\nif (nums[i] > m) {\nm = 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\nint *counter = malloc(sizeof(int) * size);\nfor (int i = 0; i < size; i++) {\ncounter[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\nfor (int i = 0; i < m; i++) {\ncounter[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\nint *res = malloc(sizeof(int) * size);\nfor (int i = size - 1; i >= 0; i--) {\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nmemcpy(nums, res, size * sizeof(int));\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{\n// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in nums)\n{\nm = 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\nint[] counter = new int[m + 1];\nforeach (int num in nums)\n{\ncounter[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\nfor (int i = 0; i < m; i++)\n{\ncounter[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\nint n = nums.Length;\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--)\n{\nint num = nums[i];\nres[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor (int i = 0; i < n; i++)\n{\nnums[i] = res[i];\n}\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\nlet 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\nvar counter = Array(repeating: 0, count: m + 1)\nfor num in nums {\ncounter[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\nfor i in stride(from: 0, to: m, by: 1) {\ncounter[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\nvar res = Array(repeating: 0, count: nums.count)\nfor i in stride(from: nums.count - 1, through: 0, by: -1) {\nlet num = nums[i]\nres[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\ncounter[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\nfor i in stride(from: 0, to: nums.count, by: 1) {\nnums[i] = res[i]\n}\n}\n
counting_sort.zig
[class]{}-[func]{countingSort}\n
"},{"location":"chapter_sorting/counting_sort/#1173","title":"11.7.3. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n + m)\\) \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 \\(O(n + m)\\) \uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \uff0c\u56e0\u6b64\u662f\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\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\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\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\u201c\u975e\u7a33\u5b9a\u201d\u7684\u3002

"},{"location":"chapter_sorting/counting_sort/#1174","title":"11.7.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\u5de5\u4f5c\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\u8981\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\uff0c\u9700\u8981\u786e\u4fdd\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u88ab\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\u5373\u53ef\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/insertion_sort/","title":"11.3. \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

\u300c\u63d2\u5165\u6392\u5e8f Insertion Sort\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u6570\u7ec4\u63d2\u5165\u64cd\u4f5c\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u9009\u62e9\u4e00\u4e2a\u5f85\u6392\u5e8f\u7684\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u503c base \uff0c\u5c06 base \u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

\u56de\u987e\u6570\u7ec4\u63d2\u5165\u64cd\u4f5c\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\u518d\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

Fig. \u5355\u6b21\u63d2\u5165\u64cd\u4f5c

"},{"location":"chapter_sorting/insertion_sort/#1131","title":"11.3.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a

  1. \u9996\u5148\uff0c\u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  2. \u63a5\u7740\uff0c\u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6570\u7ec4\u5c3e\u5143\u7d20\u4f5c\u4e3a base \uff0c\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

Fig. \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig insertion_sort.java
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < nums.length; i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base;        // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
insertion_sort.cpp
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < nums.size(); i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
insertion_sort.py
def insertion_sort(nums: list[int]) -> None:\n\"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n# \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor i in range(1, len(nums)):\nbase: int = nums[i]\nj: int = i - 1\n# \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0 and nums[j] > base:\nnums[j + 1] = nums[j]  # 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\nnums[j + 1] = base  # 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n
insertion_sort.go
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n// \u5916\u5faa\u73af\uff1a\u5f85\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a n-1, n-2, ..., 1\nfor i := 1; i < len(nums); i++ {\nbase := nums[i]\nj := i - 1\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nfor j >= 0 && nums[j] > base {\nnums[j+1] = nums[j] // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--\n}\nnums[j+1] = base // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (let i = 1; i < nums.length; i++) {\nlet base = nums[i],\nj = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (let i = 1; i < nums.length; i++) {\nconst base = nums[i];\nlet j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < size; i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\n// 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nnums[j + 1] = nums[j];\nj--;\n}\n// 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\nnums[j + 1] = base;\n}\n}\n
insertion_sort.cs
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums)\n{\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor (int i = 1; i < nums.Length; i++)\n{\nint bas = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > bas)\n{\nnums[j + 1] = nums[j]; // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = bas;         // 2. \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\uff1abase = nums[1], nums[2], ..., nums[n-1]\nfor i in stride(from: 1, to: nums.count, by: 1) {\nlet base = nums[i]\nvar j = i - 1\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0, nums[j] > base {\nnums[j + 1] = nums[j] // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\n}\nnums[j + 1] = base // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
insertion_sort.zig
// \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n// \u5916\u5faa\u73af\uff1abase = nums[1], nums[2], ..., nums[n-1]\nvar i: usize = 1;\nwhile (i < nums.len) : (i += 1) {\nvar base = nums[i];\nvar j: usize = i;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5de6\u8fb9\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 1 and nums[j - 1] > base) : (j -= 1) {\nnums[j] = nums[j - 1];  // 1. \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n}\nnums[j] = base;             // 2. \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
"},{"location":"chapter_sorting/insertion_sort/#1132","title":"11.3.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n^2)\\) \uff1a\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u522b\u9700\u8981\u5faa\u73af \\(n - 1\\) , \\(n-2\\) , \\(\\cdots\\) , \\(2\\) , \\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\(\\frac{(n - 1) n}{2}\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \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)\\) \uff0c\u56e0\u6b64\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u6240\u4ee5\u63d2\u5165\u6392\u5e8f\u662f\u201c\u539f\u5730\u6392\u5e8f\u201d\u3002

\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\uff0c\u56e0\u6b64\u662f\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/insertion_sort/#1133","title":"11.3.3. \u00a0 \u63d2\u5165\u6392\u5e8f\u4f18\u52bf","text":"

\u56de\u987e\u5192\u6ce1\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u590d\u6742\u5ea6\u5206\u6790\uff0c\u4e24\u8005\u7684\u5faa\u73af\u8f6e\u6570\u90fd\u662f \\(\\frac{(n - 1) n}{2}\\) \u3002\u7136\u800c\uff0c\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4ee5\u4e0b\u5dee\u5f02\uff1a

  • \u5192\u6ce1\u64cd\u4f5c\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\u64cd\u4f5c\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b

\u7c97\u7565\u4f30\u8ba1\u4e0b\u6765\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u7ea6\u4e3a\u63d2\u5165\u6392\u5e8f\u7684 3 \u500d\uff0c\u56e0\u6b64\u63d2\u5165\u6392\u5e8f\u66f4\u53d7\u6b22\u8fce\u3002\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u5982 Java\uff09\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u90fd\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\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u4f8b\u5982\u300c\u5feb\u901f\u6392\u5e8f\u300d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \uff1b
  • \u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u300c\u63d2\u5165\u6392\u5e8f\u300d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff1b

\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\u4e8e\u5feb\u901f\u6392\u5e8f\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u5b9e\u9645\u4e0a\u66f4\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\uff08\u5373\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u64cd\u4f5c\u6570\u91cf\uff09\u8d77\u4e3b\u5bfc\u4f5c\u7528\u3002\u8fd9\u4e2a\u73b0\u8c61\u4e0e\u300c\u7ebf\u6027\u67e5\u627e\u300d\u548c\u300c\u4e8c\u5206\u67e5\u627e\u300d\u7684\u60c5\u51b5\u76f8\u4f3c\u3002

"},{"location":"chapter_sorting/merge_sort/","title":"11.5. \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

\u300c\u5f52\u5e76\u6392\u5e8f Merge Sort\u300d\u57fa\u4e8e\u5206\u6cbb\u601d\u60f3\u5b9e\u73b0\u6392\u5e8f\uff0c\u5305\u542b\u201c\u5212\u5206\u201d\u548c\u201c\u5408\u5e76\u201d\u4e24\u4e2a\u9636\u6bb5\uff1a

  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\uff1b
  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\uff1b

Fig. \u5f52\u5e76\u6392\u5e8f\u7684\u5212\u5206\u4e0e\u5408\u5e76\u9636\u6bb5

"},{"location":"chapter_sorting/merge_sort/#1151","title":"11.5.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u201c\u5212\u5206\u9636\u6bb5\u201d\u4ece\u9876\u81f3\u5e95\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5207\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u81f3\u957f\u5ea6\u4e3a 1 \uff1b

  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\uff1b
  2. \u9012\u5f52\u6267\u884c\u6b65\u9aa4 1. \uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u533a\u95f4\u957f\u5ea6\u4e3a 1 \u65f6\uff0c\u7ec8\u6b62\u9012\u5f52\u5212\u5206\uff1b

\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>

\u89c2\u5bdf\u53d1\u73b0\uff0c\u5f52\u5e76\u6392\u5e8f\u7684\u9012\u5f52\u987a\u5e8f\u4e0e\u4e8c\u53c9\u6811\u7684\u540e\u5e8f\u904d\u5386\u76f8\u540c\uff0c\u5177\u4f53\u6765\u770b\uff1a

  • \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
JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig merge_sort.java
/* \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]\nvoid merge(int[] nums, int left, int mid, int right) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nint[] tmp = Arrays.copyOfRange(nums, left, right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++) {\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right)\nreturn;                      // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.cpp
/* \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]\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nvector<int> tmp(nums.begin() + left, nums.begin() + right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++) {\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right)\nreturn; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.py
def merge(nums: list[int], left: int, mid: int, right: int) -> None:\n\"\"\"\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]\n# \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\ntmp: list[int] = list(nums[left : right + 1])\n# \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nleft_start: int = 0\nleft_end: int = mid - left\n# \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nright_start: int = mid + 1 - left\nright_end: int = right - left\n# i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\ni: int = left_start\nj: int = right_start\n# \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor k in range(left, right + 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++\nif i > left_end:\nnums[k] = tmp[j]\nj += 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++\nelif j > right_end or tmp[i] <= tmp[j]:\nnums[k] = tmp[i]\ni += 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++\nelse:\nnums[k] = tmp[j]\nj += 1\ndef merge_sort(nums: list[int], left: int, right: int) -> None:\n\"\"\"\u5f52\u5e76\u6392\u5e8f\"\"\"\n# \u7ec8\u6b62\u6761\u4ef6\nif left >= right:\nreturn  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n# \u5212\u5206\u9636\u6bb5\nmid: int = (left + right) // 2  # \u8ba1\u7b97\u4e2d\u70b9\nmerge_sort(nums, left, mid)  # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmerge_sort(nums, mid + 1, right)  # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n# \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right)\n
merge_sort.go
/* \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]\nfunc merge(nums []int, left, mid, right int) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4 \u501f\u52a9 copy \u6a21\u5757\ntmp := make([]int, right-left+1)\nfor i := left; i <= right; i++ {\ntmp[i-left] = nums[i]\n}\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nleftStart, leftEnd := left-left, mid-left\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nrightStart, rightEnd := mid+1-left, right-left\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\ni, j := leftStart, rightStart\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor k := left; k <= right; k++ {\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++\nif i > leftEnd {\nnums[k] = tmp[j]\nj++\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 || tmp[i] <= tmp[j] {\nnums[k] = tmp[i]\ni++\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 {\nnums[k] = tmp[j]\nj++\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n// \u7ec8\u6b62\u6761\u4ef6\nif left >= right {\nreturn\n}\n// \u5212\u5206\u9636\u6bb5\nmid := (left + right) / 2\nmergeSort(nums, left, mid)\nmergeSort(nums, mid+1, right)\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right)\n}\n
merge_sort.js
/* \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]\nfunction merge(nums, left, mid, right) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nlet tmp = nums.slice(left, right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet leftStart = left - left,\nleftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet rightStart = mid + 1 - left,\nrightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nlet i = leftStart,\nj = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (let k = left; k <= right; k++) {\nif (i > leftEnd) {\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++\nnums[k] = tmp[j++];\n} else if (j > rightEnd || tmp[i] <= tmp[j]) {\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++\nnums[k] = tmp[i++];\n} else {\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++\nnums[k] = tmp[j++];\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nlet mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.ts
/* \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]\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nlet tmp = nums.slice(left, right + 1);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet leftStart = left - left,\nleftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet rightStart = mid + 1 - left,\nrightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nlet i = leftStart,\nj = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (let k = left; k <= right; k++) {\nif (i > leftEnd) {\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++\nnums[k] = tmp[j++];\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 || tmp[i] <= tmp[j]) {\nnums[k] = tmp[i++];\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 {\nnums[k] = tmp[j++];\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nlet mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.c
/* \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]\nvoid merge(int *nums, int left, int mid, int right) {\nint index;\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nint tmp[right + 1 - left];\nfor (index = left; index < right + 1; index++) {\ntmp[index - left] = nums[index];\n}\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++) {\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right)\nreturn; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.cs
/* \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]\nvoid merge(int[] nums, int left, int mid, int right)\n{\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nint[] tmp = nums[left..(right + 1)];\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15  \nint leftStart = left - left, leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15       \nint rightStart = mid + 1 - left, rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nint i = leftStart, j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor (int k = left; k <= right; k++)\n{\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++\nif (i > leftEnd)\nnums[k] = tmp[j++];\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++\nelse if (j > rightEnd || tmp[i] <= tmp[j])\nnums[k] = tmp[i++];\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++\nelse\nnums[k] = tmp[j++];\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right)\n{\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return;       // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nint mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums, left, mid, right);\n}\n
merge_sort.swift
/* \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]\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n// \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\nlet tmp = Array(nums[left ..< (right + 1)])\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet leftStart = left - left\nlet leftEnd = mid - left\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nlet rightStart = mid + 1 - left\nlet rightEnd = right - left\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nvar i = leftStart\nvar j = rightStart\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nfor k in left ... right {\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++\nif i > leftEnd {\nnums[k] = tmp[j]\nj += 1\n}\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++\nelse if j > rightEnd || tmp[i] <= tmp[j] {\nnums[k] = tmp[i]\ni += 1\n}\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++\nelse {\nnums[k] = tmp[j]\nj += 1\n}\n}\n}\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n// \u7ec8\u6b62\u6761\u4ef6\nif left >= right { // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nreturn\n}\n// \u5212\u5206\u9636\u6bb5\nlet mid = (left + right) / 2 // \u8ba1\u7b97\u4e2d\u70b9\nmergeSort(nums: &nums, left: left, right: mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\nmergeSort(nums: &nums, left: mid + 1, right: right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\nmerge(nums: &nums, left: left, mid: mid, right: right)\n}\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\nvar mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\ndefer mem_arena.deinit();\nconst mem_allocator = mem_arena.allocator();\nvar tmp = try mem_allocator.alloc(i32, right + 1 - left);\nstd.mem.copy(i32, tmp, nums[left..right+1]);\n// \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15  \nvar leftStart = left - left;\nvar leftEnd = mid - left;\n// \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15       \nvar rightStart = mid + 1 - left;\nvar rightEnd = right - left;\n// i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\nvar i = leftStart;\nvar j = rightStart;\n// \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\nvar k = left;\nwhile (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++\nif (i > leftEnd) {\nnums[k] = tmp[j];\nj += 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]) {\nnums[k] = tmp[i];\ni += 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 {\nnums[k] = tmp[j];\nj += 1;\n}\n}\n}\n// \u5f52\u5e76\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n// \u7ec8\u6b62\u6761\u4ef6\nif (left >= right) return;              // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n// \u5212\u5206\u9636\u6bb5\nvar mid = (left + right) / 2;           // \u8ba1\u7b97\u4e2d\u70b9\ntry mergeSort(nums, left, mid);         // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\ntry mergeSort(nums, mid + 1, right);    // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n// \u5408\u5e76\u9636\u6bb5\ntry merge(nums, left, mid, right);\n}\n

\u5408\u5e76\u65b9\u6cd5 merge() \u4ee3\u7801\u4e2d\u7684\u96be\u70b9\u5305\u62ec\uff1a

  • \u5728\u9605\u8bfb\u4ee3\u7801\u65f6\uff0c\u9700\u8981\u7279\u522b\u6ce8\u610f\u5404\u4e2a\u53d8\u91cf\u7684\u542b\u4e49\u3002nums \u7684\u5f85\u5408\u5e76\u533a\u95f4\u4e3a [left, right] \uff0c\u4f46\u7531\u4e8e tmp \u4ec5\u590d\u5236\u4e86 nums \u8be5\u533a\u95f4\u7684\u5143\u7d20\uff0c\u56e0\u6b64 tmp \u5bf9\u5e94\u533a\u95f4\u4e3a [0, right - left] \u3002
  • \u5728\u6bd4\u8f83 tmp[i] \u548c tmp[j] \u7684\u5927\u5c0f\u65f6\uff0c\u8fd8\u9700\u8003\u8651\u5b50\u6570\u7ec4\u904d\u5386\u5b8c\u6210\u540e\u7684\u7d22\u5f15\u8d8a\u754c\u95ee\u9898\uff0c\u5373 i > leftEnd \u548c j > rightEnd \u7684\u60c5\u51b5\u3002\u7d22\u5f15\u8d8a\u754c\u7684\u4f18\u5148\u7ea7\u662f\u6700\u9ad8\u7684\uff0c\u5982\u679c\u5de6\u5b50\u6570\u7ec4\u5df2\u7ecf\u88ab\u5408\u5e76\u5b8c\u4e86\uff0c\u90a3\u4e48\u4e0d\u9700\u8981\u7ee7\u7eed\u6bd4\u8f83\uff0c\u76f4\u63a5\u5408\u5e76\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u5373\u53ef\u3002
"},{"location":"chapter_sorting/merge_sort/#1152","title":"11.5.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \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 \\(O(n)\\) \uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\uff1b\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\uff1b\u56e0\u6b64\u662f\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\u3002

\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\uff0c\u56e0\u6b64\u5f52\u5e76\u6392\u5e8f\u662f\u201c\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/merge_sort/#1153","title":"11.5.3. \u00a0 \u94fe\u8868\u6392\u5e8f *","text":"

\u5f52\u5e76\u6392\u5e8f\u5728\u6392\u5e8f\u94fe\u8868\u65f6\u5177\u6709\u663e\u8457\u4f18\u52bf\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \uff0c\u539f\u56e0\u5982\u4e0b\uff1a

  • \u7531\u4e8e\u94fe\u8868\u4ec5\u9700\u6539\u53d8\u6307\u9488\u5c31\u53ef\u5b9e\u73b0\u8282\u70b9\u7684\u589e\u5220\u64cd\u4f5c\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\u9700\u521b\u5efa\u8f85\u52a9\u94fe\u8868\u3002
  • \u901a\u8fc7\u4f7f\u7528\u201c\u8fed\u4ee3\u5212\u5206\u201d\u66ff\u4ee3\u201c\u9012\u5f52\u5212\u5206\u201d\uff0c\u53ef\u7701\u53bb\u9012\u5f52\u4f7f\u7528\u7684\u6808\u5e27\u7a7a\u95f4\uff1b

\u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u67e5\u9605\u76f8\u5173\u8d44\u6599\u8fdb\u884c\u5b66\u4e60\u3002

"},{"location":"chapter_sorting/quick_sort/","title":"11.4. \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

\u300c\u5feb\u901f\u6392\u5e8f Quick Sort\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u601d\u60f3\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\u300c\u54e8\u5175\u5212\u5206\u300d\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\u4e3a\uff1a

  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\uff1b
  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\uff1b
  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\uff1b

\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

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

\u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u601d\u60f3

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig quick_sort.java
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j) {\nint tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cpp
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(vector<int> &nums, int i, int j) {\nint tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.py
def partition(self, nums: list[int], left: int, right: int) -> int:\n\"\"\"\u54e8\u5175\u5212\u5206\"\"\"\n# \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j = left, right\nwhile i < j:\nwhile i < j and nums[j] >= nums[left]:\nj -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile i < j and nums[i] <= nums[left]:\ni += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n# \u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n# \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.go
/* \u54e8\u5175\u5212\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j := left, right\nfor i < j {\nfor i < j && nums[j] >= nums[left] {\nj-- // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nfor i < j && nums[i] <= nums[left] {\ni++ // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n// \u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n}\n// \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u5143\u7d20\u4ea4\u6362 */\nswap(nums, i, j) {\nlet tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums, left, right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\nj -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile (i < j && nums[i] <= nums[left]) {\ni += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n// \u5143\u7d20\u4ea4\u6362\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn 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 {\nlet tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums: number[], left: number, right: number): number {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\nj -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile (i < j && nums[i] <= nums[left]) {\ni += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n// \u5143\u7d20\u4ea4\u6362\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b */\n// \u5feb\u901f\u6392\u5e8f\u7c7b-\u54e8\u5175\u5212\u5206\nint partition(int nums[], int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\n// \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nj--;\n}\nwhile (i < j && nums[i] <= nums[left]) {\n// \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\ni++;\n}\n// \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\nswap(nums, i, j);\n}\n// \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nswap(nums, i, left);\n// \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nreturn i;\n}\n
quick_sort.cs
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j)\n{\nint tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right)\n{\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j)\n{\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u5143\u7d20\u4ea4\u6362 */\nfunc swap(nums: inout [Int], i: Int, j: Int) {\nlet tmp = nums[i]\nnums[i] = nums[j]\nnums[j] = tmp\n}\n/* \u54e8\u5175\u5212\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nvar i = left\nvar j = right\nwhile i < j {\nwhile i < j, nums[j] >= nums[left] {\nj -= 1 // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile i < j, nums[i] <= nums[left] {\ni += 1 // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nswap(nums: &nums, i: i, j: j) // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums: &nums, i: i, j: left) // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.zig
// \u5143\u7d20\u4ea4\u6362\nfn swap(nums: []i32, i: usize, j: usize) void {\nvar tmp = nums[i];\nnums[i] = nums[j];\nnums[j] = tmp;\n}\n// \u54e8\u5175\u5212\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nvar i = left;\nvar j = right;\nwhile (i < j) {\nwhile (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
"},{"location":"chapter_sorting/quick_sort/#1141","title":"11.4.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"
  1. \u9996\u5148\uff0c\u5bf9\u539f\u6570\u7ec4\u6267\u884c\u4e00\u6b21\u300c\u54e8\u5175\u5212\u5206\u300d\uff0c\u5f97\u5230\u5f85\u6392\u5e8f\u7684\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\uff1b
  2. \u7136\u540e\uff0c\u5bf9\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5206\u522b\u9012\u5f52\u6267\u884c\u300c\u54e8\u5175\u5212\u5206\u300d\uff1b
  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\uff1b

Fig. \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nif (left >= right)\nreturn;\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\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\nif (left >= right)\nreturn;\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\n
quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int) -> None:\n\"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n# \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nif left >= right:\nreturn\n# \u54e8\u5175\u5212\u5206\npivot: int = self.partition(nums, left, right)\n# \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nself.quick_sort(nums, left, pivot - 1)\nself.quick_sort(nums, pivot + 1, right)\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\nif left >= right {\nreturn\n}\n// \u54e8\u5175\u5212\u5206\npivot := q.partition(nums, left, right)\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nq.quickSort(nums, left, pivot-1)\nq.quickSort(nums, pivot+1, 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\nif (left >= right) return;\n// \u54e8\u5175\u5212\u5206\nconst pivot = this.partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nthis.quickSort(nums, left, pivot - 1);\nthis.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\nif (left >= right) {\nreturn;\n}\n// \u54e8\u5175\u5212\u5206\nconst pivot = this.partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nthis.quickSort(nums, left, pivot - 1);\nthis.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b */\n// \u5feb\u901f\u6392\u5e8f\u7c7b-\u54e8\u5175\u5212\u5206\nint partition(int nums[], int left, int right) {\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\n// \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nj--;\n}\nwhile (i < j && nums[i] <= nums[left]) {\n// \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\ni++;\n}\n// \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\nswap(nums, i, j);\n}\n// \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nswap(nums, i, left);\n// \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nreturn i;\n}\n// \u5feb\u901f\u6392\u5e8f\u7c7b-\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\nif (left >= right) {\nreturn;\n}\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right)\n{\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nif (left >= right)\nreturn;\n// \u54e8\u5175\u5212\u5206\nint pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(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\nif left >= right {\nreturn\n}\n// \u54e8\u5175\u5212\u5206\nlet pivot = partition(nums: &nums, left: left, right: right)\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums: &nums, left: left, right: pivot - 1)\nquickSort(nums: &nums, left: pivot + 1, right: right)\n}\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\nif (left >= right) return;\n// \u54e8\u5175\u5212\u5206\nvar pivot = partition(nums, left, right);\n// \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\nquickSort(nums, left, pivot - 1);\nquickSort(nums, pivot + 1, right);\n}\n
"},{"location":"chapter_sorting/quick_sort/#1142","title":"11.4.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \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\\) \u5c42\uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\uff1b\u56e0\u6b64\u5feb\u901f\u6392\u5e8f\u662f\u201c\u81ea\u9002\u5e94\u6392\u5e8f\u201d\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \u3002\u7531\u4e8e\u672a\u4f7f\u7528\u8f85\u52a9\u6570\u7ec4\uff0c\u56e0\u6b64\u7b97\u6cd5\u662f\u201c\u539f\u5730\u6392\u5e8f\u201d\u3002

\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\uff0c\u56e0\u6b64\u662f\u201c\u975e\u7a33\u5b9a\u6392\u5e8f\u201d\u3002

"},{"location":"chapter_sorting/quick_sort/#1143","title":"11.4.3. \u00a0 \u5feb\u6392\u4e3a\u4ec0\u4e48\u5feb\uff1f","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\u300c\u5f52\u5e76\u6392\u5e8f\u300d\u548c\u300c\u5806\u6392\u5e8f\u300d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u539f\u56e0\u5982\u4e0b\uff1a

  • \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\u300c\u5806\u6392\u5e8f\u300d\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\u4f4e\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\u300c\u63d2\u5165\u6392\u5e8f\u300d\u6bd4\u300c\u5192\u6ce1\u6392\u5e8f\u300d\u66f4\u5feb\u7684\u539f\u56e0\u7c7b\u4f3c\u3002
"},{"location":"chapter_sorting/quick_sort/#1144","title":"11.4.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\u7684\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u90fd\u4e3a \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u4e3a\u300c\u5192\u6ce1\u6392\u5e8f\u300d\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig quick_sort.java
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\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\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cpp
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\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\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.py
def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n\"\"\"\u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\"\"\"\n# \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n# \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif (nums[left] < nums[mid]) ^ (nums[left] < nums[right]):\nreturn left\nelif (nums[mid] < nums[left]) ^ (nums[mid] < nums[right]):\nreturn mid\nreturn right\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] \u4f5c\u4e3a\u57fa\u51c6\u6570\nmed: int = self.median_three(nums, left, (left + right) // 2, right)\n# \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nnums[left], nums[med] = nums[med], nums[left]\n# \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j = left, right\nwhile i < j:\nwhile i < j and nums[j] >= nums[left]:\nj -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile i < j and nums[i] <= nums[left]:\ni += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n# \u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n# \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.go
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\uff08!= \u5728\u8fd9\u91cc\u8d77\u5230\u5f02\u6216\u7684\u4f5c\u7528\uff09\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif (nums[left] < nums[mid]) != (nums[left] < nums[right]) {\nreturn left\n} else if (nums[mid] < nums[left]) != (nums[mid] < nums[right]) {\nreturn mid\n}\nreturn right\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] \u4f5c\u4e3a\u57fa\u51c6\u6570\nmed := q.medianThree(nums, left, (left+right)/2, right)\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nnums[left], nums[med] = nums[med], nums[left]\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\ni, j := left, right\nfor i < j {\nfor i < j && nums[j] >= nums[left] {\nj-- //\u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nfor i < j && nums[i] <= nums[left] {\ni++ //\u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\n//\u5143\u7d20\u4ea4\u6362\nnums[i], nums[j] = nums[j], nums[i]\n}\n//\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nnums[i], nums[left] = nums[left], nums[i]\nreturn i //\u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(nums, left, mid, right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right])) return left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse return right;\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\nlet med = this.medianThree(\nnums,\nleft,\nMath.floor((left + right) / 2),\nright\n);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nthis.swap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(\nnums: number[],\nleft: number,\nmid: number,\nright: number\n): number {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif (Number(nums[left] < nums[mid]) ^ Number(nums[left] < nums[right])) {\nreturn left;\n} else if (\nNumber(nums[mid] < nums[left]) ^ Number(nums[mid] < nums[right])\n) {\nreturn mid;\n} else {\nreturn 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\nlet med = this.medianThree(\nnums,\nleft,\nMath.floor((left + right) / 2),\nright\n);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nthis.swap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nlet i = left,\nj = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left]) {\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nwhile (i < j && nums[i] <= nums[left]) {\ni++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n}\nthis.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nthis.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b\uff08\u4e2d\u4f4d\u57fa\u51c6\u6570\u4f18\u5316\uff09 */\n// \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nint medianThree(int nums[], int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\n}\n/* \u5feb\u901f\u6392\u5e8f\u7c7b\uff08\u4e2d\u4f4d\u57fa\u51c6\u6570\u4f18\u5316\uff09 */\n// \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nint medianThree(int nums[], int left, int mid, int right) {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\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\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j) {\nwhile (i < j && nums[j] >= nums[left])\nj--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right)\n{\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) ^ (nums[left] < nums[right]))\nreturn left;\nelse if ((nums[mid] < nums[left]) ^ (nums[mid] < nums[right]))\nreturn mid;\nelse\nreturn right;\n}\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right)\n{\n// \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nint med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nint i = left, j = right;\nwhile (i < j)\n{\nwhile (i < j && nums[j] >= nums[left])\nj--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j && nums[i] <= nums[left])\ni++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\nif (nums[left] < nums[mid]) != (nums[left] < nums[right]) {\nreturn left\n} else if (nums[mid] < nums[left]) != (nums[mid] < nums[right]) {\nreturn mid\n} else {\nreturn 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\nlet 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\nswap(nums: &nums, i: left, j: med)\nreturn partition(nums: &nums, left: left, right: right)\n}\n
quick_sort.zig
// \u9009\u53d6\u4e09\u4e2a\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n// \u6b64\u5904\u4f7f\u7528\u5f02\u6216\u8fd0\u7b97\u6765\u7b80\u5316\u4ee3\u7801\n// \u5f02\u6216\u89c4\u5219\u4e3a 0 ^ 0 = 1 ^ 1 = 0, 0 ^ 1 = 1 ^ 0 = 1\nif ((nums[left] < nums[mid]) != (nums[left] < nums[right])) {\nreturn left;\n} else if ((nums[mid] < nums[left]) != (nums[mid] < nums[right])) {\nreturn mid;\n} else {\nreturn 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\nvar med = medianThree(nums, left, (left + right) / 2, right);\n// \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\nswap(nums, left, med);\n// \u4ee5 nums[left] \u4f5c\u4e3a\u57fa\u51c6\u6570\nvar i = left;\nvar j = right;\nwhile (i < j) {\nwhile (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nwhile (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\nswap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n}\nswap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\nreturn i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
"},{"location":"chapter_sorting/quick_sort/#1145","title":"11.4.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\u5012\u5e8f\u7684\u8f93\u5165\u6570\u7ec4\u4e3a\u4f8b\uff0c\u7531\u4e8e\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \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 \\(\\frac{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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;                 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1;                 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int) -> None:\n\"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\"\"\"\n# \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\nwhile left < right:\n# \u54e8\u5175\u5212\u5206\u64cd\u4f5c\npivot: int = self.partition(nums, left, right)\n# \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif pivot - left < right - pivot:\nself.quick_sort(nums, left, pivot - 1)  # \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1  # \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\nelse:\nself.quick_sort(nums, pivot + 1, right)  # \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1  # \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\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\nfor left < right {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\npivot := q.partition(nums, left, right)\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif pivot-left < right-pivot {\nq.quickSort(nums, left, pivot-1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1                 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nq.quickSort(nums, pivot+1, right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1                 // \u5269\u4f59\u5f85\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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nlet pivot = this.partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nthis.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nthis.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nlet pivot = this.partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nthis.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nthis.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\u7c7b\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\n// \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\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSortTailCall(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;                         // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSortTailCall(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1;                         // \u5269\u4f59\u5f85\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{\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\nwhile (left < right)\n{\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nint pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot)\n{\nquickSort(nums, left, pivot - 1);  // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;  // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n}\nelse\n{\nquickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1; // \u5269\u4f59\u5f85\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) {\nvar left = left\nvar right = right\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\nwhile left < right {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nlet pivot = partition(nums: &nums, left: left, right: right)\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left) < (right - pivot) {\nquickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1 // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\nvar left = left_;\nvar right = right_;\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\nwhile (left < right) {\n// \u54e8\u5175\u5212\u5206\u64cd\u4f5c\nvar pivot = partition(nums, left, right);\n// \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u6392\nif (pivot - left < right - pivot) {\nquickSort(nums, left, pivot - 1);   // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\nleft = pivot + 1;                   // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n} else {\nquickSort(nums, pivot + 1, right);  // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\nright = pivot - 1;                  // \u5269\u4f59\u5f85\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n

\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\u5c0f\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

"},{"location":"chapter_sorting/radix_sort/","title":"11.8. \u00a0 \u57fa\u6570\u6392\u5e8f","text":"

\u4e0a\u4e00\u8282\u6211\u4eec\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

\u300c\u57fa\u6570\u6392\u5e8f Radix Sort\u300d\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/#1181","title":"11.8.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\u6b65\u9aa4\u5982\u4e0b\uff1a

  1. \u521d\u59cb\u5316\u4f4d\u6570 \\(k = 1\\) \uff1b
  2. \u5bf9\u5b66\u53f7\u7684\u7b2c \\(k\\) \u4f4d\u6267\u884c\u300c\u8ba1\u6570\u6392\u5e8f\u300d\u3002\u5b8c\u6210\u540e\uff0c\u6570\u636e\u4f1a\u6839\u636e\u7b2c \\(k\\) \u4f4d\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\uff1b
  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\uff1b

Fig. \u57fa\u6570\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

\u4e0b\u9762\u6765\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 \\mod d \\]

\u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\mod d\\) \u8868\u793a\u5bf9 \\(d\\) \u53d6\u4f59\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nreturn (num / exp) % 10;\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\nint[] counter = new int[10];\nint n = nums.length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < n; i++) {\nint d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (int i = 1; i < 10; i++) {\ncounter[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\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--) {\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < n; i++)\nnums[i] = res[i];\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\nint m = Integer.MIN_VALUE;\nfor (int num : nums)\nif (num > m)\nm = num;\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, exp);\n}\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\nreturn (num / exp) % 10;\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\nvector<int> counter(10, 0);\nint n = nums.size();\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < n; i++) {\nint d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (int i = 1; i < 10; i++) {\ncounter[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\nvector<int> res(n, 0);\nfor (int i = n - 1; i >= 0; i--) {\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < n; i++)\nnums[i] = res[i];\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\nint m = *max_element(nums.begin(), nums.end());\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, exp);\n}\n
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\nreturn (num // exp) % 10\ndef counting_sort_digit(nums: list[int], exp: int) -> None:\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\ncounter = [0] * 10\nn = len(nums)\n# \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor i in range(n):\nd = digit(nums[i], exp)  # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor i in range(1, 10):\ncounter[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\nres = [0] * n\nfor i in range(n - 1, -1, -1):\nd = digit(nums[i], exp)\nj = counter[d] - 1  # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]  # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d] -= 1  # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n# \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor i in range(n):\nnums[i] = res[i]\ndef radix_sort(nums: list[int]) -> None:\n\"\"\"\u57fa\u6570\u6392\u5e8f\"\"\"\n# \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\nm = max(nums)\n# \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nexp = 1\nwhile 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)\ncounting_sort_digit(nums, exp)\nexp *= 10\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\nreturn (num / exp) % 10\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\ncounter := make([]int, 10)\nn := len(nums)\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor i := 0; i < n; i++ {\nd := digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor i := 1; i < 10; i++ {\ncounter[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\nres := make([]int, n)\nfor i := n - 1; i >= 0; i-- {\nd := digit(nums[i], exp)\nj := counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]    // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor i := 0; i < n; i++ {\nnums[i] = res[i]\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\nmax := math.MinInt\nfor _, num := range nums {\nif num > max {\nmax = num\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor 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)\ncountingSortDigit(nums, 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\nreturn Math.floor(num / exp) % 10;\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\nconst counter = new Array(10).fill(0);\nconst n = nums.length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (let i = 0; i < n; i++) {\nconst d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (let i = 1; i < 10; i++) {\ncounter[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\nconst res = new Array(n).fill(0);\nfor (let i = n - 1; i >= 0; i--) {\nconst d = digit(nums[i], exp);\nconst j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (let i = 0; i < n; i++) {\nnums[i] = res[i];\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\nlet m = Number.MIN_VALUE;\nfor (const num of nums) {\nif (num > m) {\nm = num;\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(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\nreturn Math.floor(num / exp) % 10;\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\nconst counter = new Array(10).fill(0);\nconst n = nums.length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (let i = 0; i < n; i++) {\nconst d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (let i = 1; i < 10; i++) {\ncounter[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\nconst res = new Array(n).fill(0);\nfor (let i = n - 1; i >= 0; i--) {\nconst d = digit(nums[i], exp);\nconst j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (let i = 0; i < n; i++) {\nnums[i] = res[i];\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\nlet m = Number.MIN_VALUE;\nfor (const num of nums) {\nif (num > m) {\nm = num;\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, exp);\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\nreturn (num / exp) % 10;\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\nint *counter = (int *)malloc((sizeof(int) * 10));\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < size; i++) {\n// \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\nint d = digit(nums[i], exp);\n// \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\ncounter[d]++;\n}\n// \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\nfor (int i = 1; i < 10; i++) {\ncounter[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\nint *res = (int *)malloc(sizeof(int) * size);\nfor (int i = size - 1; i >= 0; i--) {\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < size; i++) {\nnums[i] = res[i];\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\nint max = INT32_MIN;\nfor (size_t i = 0; i < size - 1; i++) {\nif (nums[i] > max) {\nmax = nums[i];\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (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)\ncountingSortDigit(nums, size, exp);\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{\n// \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\nreturn (num / exp) % 10;\n}\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp)\n{\n// \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\nint[] counter = new int[10];\nint n = nums.Length;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (int i = 0; i < n; i++)\n{\nint d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor (int i = 1; i < 10; i++)\n{\ncounter[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\nint[] res = new int[n];\nfor (int i = n - 1; i >= 0; i--)\n{\nint d = digit(nums[i], exp);\nint j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor (int i = 0; i < n; i++)\n{\nnums[i] = res[i];\n}\n}\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int[] nums)\n{\n// \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\nint m = int.MinValue;\nforeach (int num in nums)\n{\nif (num > m) m = num;\n}               // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor (int exp = 1; exp <= m; exp *= 10)\n{\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)\ncountingSortDigit(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/* \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\nvar counter = Array(repeating: 0, count: 10)\nlet n = nums.count\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor i in nums.indices {\nlet d = digit(num: nums[i], exp: exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nfor i in 1 ..< 10 {\ncounter[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\nvar res = Array(repeating: 0, count: n)\nfor i in stride(from: n - 1, through: 0, by: -1) {\nlet d = digit(num: nums[i], exp: exp)\nlet j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i] // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d] -= 1 // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\nfor i in nums.indices {\nnums[i] = res[i]\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\nvar m = Int.min\nfor num in nums {\nif num > m {\nm = num\n}\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nfor 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)\ncountingSortDigit(nums: &nums, exp: exp)\n}\n}\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\nreturn @mod(@divFloor(num, exp), 10);\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\nvar mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n// defer mem_arena.deinit();\nconst mem_allocator = mem_arena.allocator();\nvar counter = try mem_allocator.alloc(usize, 10);\nstd.mem.set(usize, counter, 0);\nvar n = nums.len;\n// \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\nfor (nums) |num| {\nvar d = @bitCast(u32, digit(num, exp)); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\ncounter[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\nvar i: usize = 1;\nwhile (i < 10) : (i += 1) {\ncounter[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\nvar res = try mem_allocator.alloc(i32, n);\ni = n - 1;\nwhile (i >= 0) : (i -= 1) {\nvar d = @bitCast(u32, digit(nums[i], exp));\nvar j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\nres[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\ncounter[d] -= 1;        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\nif (i == 0) break;\n}\n// \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\ni = 0;\nwhile (i < n) : (i += 1) {\nnums[i] = res[i];\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\nvar m: i32 = std.math.minInt(i32);\nfor (nums) |num| {\nif (num > m) m = num;\n}\n// \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\nvar exp: i32 = 1;\nwhile (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)\ntry countingSortDigit(nums, exp);    }\n} 

\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\u6211\u4eec\u5e94\u8be5\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

"},{"location":"chapter_sorting/radix_sort/#1182","title":"11.8.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk)\\) \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 \\(O(n + d)\\) \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 \uff0c\u56e0\u6b64\u5b83\u662f\u4e00\u79cd\u201c\u975e\u539f\u5730\u6392\u5e8f\u201d\u3002

\u57fa\u6570\u6392\u5e8f\u4e0e\u8ba1\u6570\u6392\u5e8f\u4e00\u6837\uff0c\u90fd\u5c5e\u4e8e\u7a33\u5b9a\u6392\u5e8f\u3002\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

"},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1. \u00a0 \u6392\u5e8f\u7b97\u6cd5","text":"

\u300c\u6392\u5e8f\u7b97\u6cd5 Sorting Algorithm\u300d\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\u6709\u6548\u5730\u67e5\u627e\u3001\u5206\u6790\u548c\u5904\u7406\u3002

\u5728\u6392\u5e8f\u7b97\u6cd5\u4e2d\uff0c\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u6216\u5b57\u7b26\u4e32\u7b49\uff1b\u987a\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

Fig. \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\u5373\u65f6\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u964d\u4f4e\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u91cf\u60c5\u51b5\uff0c\u8fd0\u884c\u6548\u7387\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002

\u5c31\u5730\u6027\uff1a\u987e\u540d\u601d\u4e49\uff0c\u300c\u539f\u5730\u6392\u5e8f\u300d\u901a\u8fc7\u5728\u539f\u6570\u7ec4\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\uff0c\u65e0\u9700\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\u300c\u7a33\u5b9a\u6392\u5e8f\u300d\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\u4f18\u826f\u7279\u6027\uff0c\u4e5f\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, 2 \u5217\u5206\u522b\u662f\u59d3\u540d\u548c\u5e74\u9f84\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u300c\u975e\u7a33\u5b9a\u6392\u5e8f\u300d\u53ef\u80fd\u5bfc\u81f4\u8f93\u5165\u6570\u636e\u7684\u6709\u5e8f\u6027\u4e27\u5931\u3002

# \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# \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\u300c\u81ea\u9002\u5e94\u6392\u5e8f\u300d\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u53d7\u8f93\u5165\u6570\u636e\u7684\u5f71\u54cd\uff0c\u5373\u6700\u4f73\u3001\u6700\u5dee\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\u300c\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u300d\u4f9d\u8d56\u4e8e\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\\(<\\) , \\(=\\) , \\(>\\)\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\u300c\u975e\u6bd4\u8f83\u6392\u5e8f\u300d\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.9. \u00a0 \u5c0f\u7ed3","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\u5f85\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\u5b83\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

Fig. \u6392\u5e8f\u7b97\u6cd5\u5bf9\u6bd4

  • \u603b\u4f53\u6765\u770b\uff0c\u6211\u4eec\u8ffd\u6c42\u8fd0\u884c\u5feb\u3001\u7a33\u5b9a\u3001\u539f\u5730\u3001\u6b63\u5411\u81ea\u9002\u5e94\u6027\u7684\u6392\u5e8f\u3002\u663e\u7136\uff0c\u5982\u540c\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e00\u6837\uff0c\u540c\u65f6\u6ee1\u8db3\u8fd9\u4e9b\u6761\u4ef6\u7684\u6392\u5e8f\u7b97\u6cd5\u5e76\u4e0d\u5b58\u5728\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u95ee\u9898\u7279\u70b9\u6765\u9009\u62e9\u6392\u5e8f\u7b97\u6cd5\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
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3. \u00a0 \u53cc\u5411\u961f\u5217","text":"

\u5bf9\u4e8e\u961f\u5217\uff0c\u6211\u4eec\u4ec5\u80fd\u5728\u5934\u90e8\u5220\u9664\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u3002\u7136\u800c\uff0c\u300c\u53cc\u5411\u961f\u5217 Deque\u300d\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

Fig. \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\u4e0b\u8868\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

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 pushFirst() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u9996 \\(O(1)\\) pushLast() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) popFirst() \u5220\u9664\u961f\u9996\u5143\u7d20 \\(O(1)\\) popLast() \u5220\u9664\u961f\u5c3e\u5143\u7d20 \\(O(1)\\) peekFirst() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\) peekLast() \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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig deque.java
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nDeque<Integer> deque = new LinkedList<>();\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/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u961f\u5c3e\u5143\u7d20\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/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
deque.cpp
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\ndeque<int> deque;\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/* \u8bbf\u95ee\u5143\u7d20 */\nint front = deque.front(); // \u961f\u9996\u5143\u7d20\nint back = deque.back();   // \u961f\u5c3e\u5143\u7d20\n/* \u5143\u7d20\u51fa\u961f */\ndeque.pop_front();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.pop_back();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = deque.empty();\n
deque.py
# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\ndeque: Deque[int] = collections.deque()\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# \u8bbf\u95ee\u5143\u7d20\nfront: int = deque[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u961f\u5c3e\u5143\u7d20\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# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deque)\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deque) == 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/* \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/* \u8bbf\u95ee\u5143\u7d20 */\nfront := deque.Front() // \u961f\u9996\u5143\u7d20\nrear := deque.Back()   // \u961f\u5c3e\u5143\u7d20\n/* \u5143\u7d20\u51fa\u961f */\ndeque.Remove(front)    // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.Remove(rear)     // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize := deque.Len()\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := deque.Len() == 0\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/* \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);\nconsole.log(\"\u53cc\u5411\u961f\u5217 deque = \", deque);\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst = deque[0];\nconsole.log(\"\u961f\u9996\u5143\u7d20 peekFirst = \" + peekFirst);\nconst peekLast = deque[deque.length - 1];\nconsole.log(\"\u961f\u5c3e\u5143\u7d20 peekLast = \" + peekLast);\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();\nconsole.log(\"\u961f\u9996\u51fa\u961f\u5143\u7d20 popFront = \" + popFront + \"\uff0c\u961f\u9996\u51fa\u961f\u540e deque = \" + deque);\nconst popBack = deque.pop();\nconsole.log(\"\u961f\u5c3e\u51fa\u961f\u5143\u7d20 popBack = \" + popBack + \"\uff0c\u961f\u5c3e\u51fa\u961f\u540e deque = \" + deque);\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = deque.length;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u957f\u5ea6 size = \" + size);\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty = size === 0;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a = \" + isEmpty);\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/* \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);\nconsole.log(\"\u53cc\u5411\u961f\u5217 deque = \", deque);\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconsole.log(\"\u961f\u9996\u5143\u7d20 peekFirst = \" + peekFirst);\nconst peekLast: number = deque[deque.length - 1];\nconsole.log(\"\u961f\u5c3e\u5143\u7d20 peekLast = \" + peekLast);\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;\nconsole.log(\"\u961f\u9996\u51fa\u961f\u5143\u7d20 popFront = \" + popFront + \"\uff0c\u961f\u9996\u51fa\u961f\u540e deque = \" + deque);\nconst popBack: number = deque.pop() as number;\nconsole.log(\"\u961f\u5c3e\u51fa\u961f\u5143\u7d20 popBack = \" + popBack + \"\uff0c\u961f\u5c3e\u51fa\u961f\u540e deque = \" + deque);\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size: number = deque.length;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u957f\u5ea6 size = \" + size);\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty: boolean = size === 0;\nconsole.log(\"\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a = \" + isEmpty);\n
deque.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u53cc\u5411\u961f\u5217\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 LinkedList<int>();\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/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u961f\u5c3e\u5143\u7d20\n/* \u5143\u7d20\u51fa\u961f */\ndeque.RemoveFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.RemoveLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.Count;\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.Count == 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/* \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/* \u8bbf\u95ee\u5143\u7d20 */\nlet peekFirst = deque.first! // \u961f\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u961f\u5c3e\u5143\u7d20\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/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.count\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = deque.isEmpty\n
deque.zig
\n
"},{"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":"\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\u300c\u53cc\u5411\u94fe\u8868\u300d\u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

\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

LinkedListDequepushLast()pushFirst()popLast()popFirst()

\u4ee5\u4e0b\u662f\u5177\u4f53\u5b9e\u73b0\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linkedlist_deque.java
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nint val; // \u8282\u70b9\u503c\nListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nListNode(int val) {\nthis.val = val;\nprev = next = null;\n}\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nprivate int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npublic LinkedListDeque() {\nfront = rear = null;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f\u64cd\u4f5c */\nprivate void push(int num, boolean isFront) {\nListNode node = new ListNode(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (isEmpty())\nfront = rear = node;\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if (isFront) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nfront.prev = node;\nnode.next = front;\nfront = 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\nrear.next = node;\nnode.prev = rear;\nrear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\npublic void pushFirst(int num) {\npush(num, true);\n}\n/* \u961f\u5c3e\u5165\u961f */\npublic void pushLast(int num) {\npush(num, false);\n}\n/* \u51fa\u961f\u64cd\u4f5c */\nprivate Integer pop(boolean isFront) {\n// \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\nif (isEmpty())\nreturn null;\nint val;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (isFront) {\nval = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nListNode fNext = front.next;\nif (fNext != null) {\nfNext.prev = null;\nfront.next = null;\n}\nfront = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n} else {\nval = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nListNode rPrev = rear.prev;\nif (rPrev != null) {\nrPrev.next = null;\nrear.prev = null;\n}\nrear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n}\n/* \u961f\u9996\u51fa\u961f */\npublic Integer popFirst() {\nreturn pop(true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\npublic Integer popLast() {\nreturn pop(false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic Integer peekFirst() {\nreturn isEmpty() ? null : front.val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic Integer peekLast() {\nreturn isEmpty() ? null : rear.val;\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\npublic int[] toArray() {\nListNode node = front;\nint[] res = new int[size()];\nfor (int i = 0; i < res.length; i++) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_deque.cpp
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\nint val;              // \u8282\u70b9\u503c\nDoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\nDoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\nDoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n}\n};\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate:\nDoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nint queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nLinkedListDeque() : front(nullptr), rear(nullptr) {\n}\n/* \u6790\u6784\u65b9\u6cd5 */\n~LinkedListDeque() {\n// \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\nDoublyListNode *pre, *cur = front;\nwhile (cur != nullptr) {\npre = cur;\ncur = cur->next;\ndelete pre;\n}\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f\u64cd\u4f5c */\nvoid push(int num, bool isFront) {\nDoublyListNode *node = new DoublyListNode(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (isEmpty())\nfront = rear = node;\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if (isFront) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nfront->prev = node;\nnode->next = front;\nfront = 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\nrear->next = node;\nnode->prev = rear;\nrear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(int num) {\npush(num, true);\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(int num) {\npush(num, false);\n}\n/* \u51fa\u961f\u64cd\u4f5c */\nint pop(bool isFront) {\n// \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de -1\nif (isEmpty())\nreturn -1;\nint val;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (isFront) {\nval = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nDoublyListNode *fNext = front->next;\nif (fNext != nullptr) {\nfNext->prev = nullptr;\nfront->next = nullptr;\ndelete front;\n}\nfront = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n} else {\nval = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nDoublyListNode *rPrev = rear->prev;\nif (rPrev != nullptr) {\nrPrev->next = nullptr;\nrear->prev = nullptr;\ndelete rear;\n}\nrear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst() {\nreturn pop(true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast() {\nreturn pop(false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst() {\nreturn isEmpty() ? -1 : front->val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast() {\nreturn isEmpty() ? -1 : rear->val;\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nvector<int> toVector() {\nDoublyListNode *node = front;\nvector<int> res(size());\nfor (int i = 0; i < res.size(); i++) {\nres[i] = node->val;\nnode = node->next;\n}\nreturn res;\n}\n};\n
linkedlist_deque.py
class ListNode:\n\"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\ndef __init__(self, val: int) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.val: int = val\nself.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nself.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nclass LinkedListDeque:\n\"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\ndef __init__(self) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.front: ListNode | None = None  # \u5934\u8282\u70b9 front\nself.rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\nself.__size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.size() == 0\ndef push(self, num: int, is_front: bool) -> None:\n\"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\nnode = ListNode(num)\n# \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif self.is_empty():\nself.front = self.rear = node\n# \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelif is_front:\n# \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nself.front.prev = node\nnode.next = self.front\nself.front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n# \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\nelse:\n# \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nself.rear.next = node\nnode.prev = self.rear\nself.rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\nself.__size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\ndef push_first(self, num: int) -> None:\n\"\"\"\u961f\u9996\u5165\u961f\"\"\"\nself.push(num, True)\ndef push_last(self, num: int) -> None:\n\"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\nself.push(num, False)\ndef pop(self, is_front: bool) -> int:\n\"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n# \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\nif self.is_empty():\nreturn None\n# \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif is_front:\nval: int = self.front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n# \u5220\u9664\u5934\u8282\u70b9\nfnext: ListNode | None = self.front.next\nif fnext != None:\nfnext.prev = None\nself.front.next = None\nself.front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n# \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse:\nval: int = self.rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n# \u5220\u9664\u5c3e\u8282\u70b9\nrprev: ListNode | None = self.rear.prev\nif rprev != None:\nrprev.next = None\nself.rear.prev = None\nself.rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\nself.__size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val\ndef pop_first(self) -> int:\n\"\"\"\u961f\u9996\u51fa\u961f\"\"\"\nreturn self.pop(True)\ndef pop_last(self) -> int:\n\"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\nreturn self.pop(False)\ndef peek_first(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nreturn None if self.is_empty() else self.front.val\ndef peek_last(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\nreturn None if self.is_empty() else self.rear.val\ndef to_array(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\nnode: ListNode | None = self.front\nres: list[int] = [0] * self.size()\nfor i in range(self.size()):\nres[i] = node.val\nnode = node.next\nreturn res\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\ndata *list.List\n}\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\nreturn &linkedListDeque{\ndata: list.New(),\n}\n}\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\ns.data.PushFront(value)\n}\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\ns.data.PushBack(value)\n}\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\nreturn e.Value\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\nreturn e.Value\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\nreturn s.data.Len()\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\nreturn s.data.Len() == 0\n}\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\nreturn s.data\n}\n
linkedlist_deque.js
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nprev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nnext; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nval; // \u8282\u70b9\u503c\nconstructor(val) {\nthis.val = val;\nthis.next = null;\nthis.prev = null;\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\nconstructor() {\nthis.#front = null;\nthis.#rear = null;\nthis.#queSize = 0;\n}\n/* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\npushLast(val) {\nconst node = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.#queSize === 0) {\nthis.#front = node;\nthis.#rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nthis.#rear.next = node;\nnode.prev = this.#rear;\nthis.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nthis.#queSize++;\n}\n/* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\npushFirst(val) {\nconst node = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.#queSize === 0) {\nthis.#front = node;\nthis.#rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nthis.#front.prev = node;\nnode.next = this.#front;\nthis.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n}\nthis.#queSize++;\n}\n/* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\npopLast() {\nif (this.#queSize === 0) {\nreturn null;\n}\nconst value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nlet temp = this.#rear.prev;\nif (temp !== null) {\ntemp.next = null;\nthis.#rear.prev = null;\n}\nthis.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\nthis.#queSize--;\nreturn value;\n}\n/* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\npopFirst() {\nif (this.#queSize === 0) {\nreturn null;\n}\nconst value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nlet temp = this.#front.next;\nif (temp !== null) {\ntemp.prev = null;\nthis.#front.next = null;\n}\nthis.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\nthis.#queSize--;\nreturn value;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast() {\nreturn this.#queSize === 0 ? null : this.#rear.val;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst() {\nreturn this.#queSize === 0 ? null : this.#front.val;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.#queSize === 0;\n}\n/* \u6253\u5370\u53cc\u5411\u961f\u5217 */\nprint() {\nconst arr = [];\nlet temp = this.#front;\nwhile (temp !== null) {\narr.push(temp.val);\ntemp = temp.next;\n}\nconsole.log('[' + arr.join(', ') + ']');\n}\n}\n
linkedlist_deque.ts
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nprev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nnext: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\nval: number; // \u8282\u70b9\u503c\nconstructor(val: number) {\nthis.val = val;\nthis.next = null;\nthis.prev = null;\n}\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate front: ListNode; // \u5934\u8282\u70b9 front\nprivate rear: ListNode; // \u5c3e\u8282\u70b9 rear\nprivate queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nconstructor() {\nthis.front = null;\nthis.rear = null;\nthis.queSize = 0;\n}\n/* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\npushLast(val: number): void {\nconst node: ListNode = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.queSize === 0) {\nthis.front = node;\nthis.rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nthis.rear.next = node;\nnode.prev = this.rear;\nthis.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nthis.queSize++;\n}\n/* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\npushFirst(val: number): void {\nconst node: ListNode = new ListNode(val);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (this.queSize === 0) {\nthis.front = node;\nthis.rear = node;\n} else {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nthis.front.prev = node;\nnode.next = this.front;\nthis.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n}\nthis.queSize++;\n}\n/* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\npopLast(): number {\nif (this.queSize === 0) {\nreturn null;\n}\nconst value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nlet temp: ListNode = this.rear.prev;\nif (temp !== null) {\ntemp.next = null;\nthis.rear.prev = null;\n}\nthis.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\nthis.queSize--;\nreturn value;\n}\n/* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\npopFirst(): number {\nif (this.queSize === 0) {\nreturn null;\n}\nconst value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nlet temp: ListNode = this.front.next;\nif (temp !== null) {\ntemp.prev = null;\nthis.front.next = null;\n}\nthis.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\nthis.queSize--;\nreturn value;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast(): number {\nreturn this.queSize === 0 ? null : this.rear.val;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst(): number {\nreturn this.queSize === 0 ? null : this.front.val;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.queSize === 0;\n}\n/* \u6253\u5370\u53cc\u5411\u961f\u5217 */\nprint(): void {\nconst arr: number[] = [];\nlet temp: ListNode = this.front;\nwhile (temp !== null) {\narr.push(temp.val);\ntemp = temp.next;\n}\nconsole.log('[' + arr.join(', ') + ']');\n}\n}\n
linkedlist_deque.c
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct doublyListNode {\nint val;                     // \u8282\u70b9\u503c\nstruct doublyListNode *next; // \u540e\u7ee7\u8282\u70b9\nstruct doublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n};\n/* \u6784\u9020\u51fd\u6570 */\ndoublyListNode *newDoublyListNode(int num) {\ndoublyListNode *new = (doublyListNode *)malloc(sizeof(doublyListNode));\nnew->val = num;\nnew->next = NULL;\nnew->prev = NULL;\nreturn new;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(doublyListNode *node) {\nfree(node);\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct linkedListDeque {\ndoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nint queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n};\n/* \u6784\u9020j */\nlinkedListDeque *newLinkedListDeque() {\nlinkedListDeque *deque = (linkedListDeque *)malloc(sizeof(linkedListDeque));\ndeque->front = NULL;\ndeque->rear = NULL;\ndeque->queSize = 0;\nreturn deque;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(linkedListDeque *deque) {\n// \u91ca\u653e\u6240\u6709\u8282\u70b9\nfor (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\ndoublyListNode *tmp = deque->front;\ndeque->front = deque->front->next;\nfree(tmp);\n}\n// \u91ca\u653e deque \u7ed3\u6784\u4f53\nfree(deque);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(linkedListDeque *deque) {\nreturn deque->queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(linkedListDeque *deque) {\nreturn (size(deque) == 0);\n}\n/* \u5165\u961f */\nvoid push(linkedListDeque *deque, int num, bool isFront) {\ndoublyListNode *node = newDoublyListNode(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411node\nif (empty(deque)) {\ndeque->front = deque->rear = node;\n}\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if (isFront) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\ndeque->front->prev = node;\nnode->next = deque->front;\ndeque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u5bf9\u5c3e\u5165\u961f\u64cd\u4f5c\nelse {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\ndeque->rear->next = node;\nnode->prev = deque->rear;\ndeque->rear = node;\n}\ndeque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(linkedListDeque *deque, int num) {\npush(deque, num, true);\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(linkedListDeque *deque, int num) {\npush(deque, num, false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(linkedListDeque *deque) {\nassert(size(deque) && deque->front);\nreturn deque->front->val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(linkedListDeque *deque) {\nassert(size(deque) && deque->rear);\nreturn deque->rear->val;\n}\n/* \u51fa\u961f */\nint pop(linkedListDeque *deque, bool isFront) {\nif (empty(deque))\nreturn -1;\nint val;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (isFront) {\nval = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\ndoublyListNode *fNext = deque->front->next;\nif (fNext) {\nfNext->prev = NULL;\ndeque->front->next = NULL;\ndelDoublyListNode(deque->front);\n}\ndeque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse {\nval = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\ndoublyListNode *rPrev = deque->rear->prev;\nif (rPrev) {\nrPrev->next = NULL;\ndeque->rear->prev = NULL;\ndelDoublyListNode(deque->rear);\n}\ndeque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\ndeque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(linkedListDeque *deque) {\nreturn pop(deque, true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(linkedListDeque *deque) {\nreturn pop(deque, false);\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(linkedListDeque *deque) {\nint arr[deque->queSize];\n// \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\nint i;\ndoublyListNode *node;\nfor (i = 0, node = deque->front; i < deque->queSize; i++) {\narr[i] = node->val;\nnode = node->next;\n}\nprintArray(arr, deque->queSize);\n}\n
linkedlist_deque.cs
[class]{ListNode}-[func]{}\n[class]{LinkedListDeque}-[func]{}\n
linkedlist_deque.swift
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\nvar val: Int // \u8282\u70b9\u503c\nvar next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nvar prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\ninit(val: Int) {\nself.val = val\n}\n}\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\nprivate var front: ListNode? // \u5934\u8282\u70b9 front\nprivate var rear: ListNode? // \u5c3e\u8282\u70b9 rear\nprivate var queSize: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\ninit() {\nqueSize = 0\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nqueSize\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u5165\u961f\u64cd\u4f5c */\nprivate func push(num: Int, isFront: Bool) {\nlet node = ListNode(val: num)\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif isEmpty() {\nfront = node\nrear = node\n}\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\nelse if isFront {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nfront?.prev = node\nnode.next = front\nfront = node // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\nelse {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\nrear?.next = node\nnode.prev = rear\nrear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n/* \u961f\u9996\u5165\u961f */\nfunc pushFirst(num: Int) {\npush(num: num, isFront: true)\n}\n/* \u961f\u5c3e\u5165\u961f */\nfunc pushLast(num: Int) {\npush(num: num, isFront: false)\n}\n/* \u51fa\u961f\u64cd\u4f5c */\nprivate func pop(isFront: Bool) -> Int {\nif isEmpty() {\nfatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n}\nlet val: Int\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif isFront {\nval = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nlet fNext = front?.next\nif fNext != nil {\nfNext?.prev = nil\nfront?.next = nil\n}\nfront = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n}\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse {\nval = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nlet rPrev = rear?.prev\nif rPrev != nil {\nrPrev?.next = nil\nrear?.prev = nil\n}\nrear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nqueSize -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val\n}\n/* \u961f\u9996\u51fa\u961f */\nfunc popFirst() -> Int {\npop(isFront: true)\n}\n/* \u961f\u5c3e\u51fa\u961f */\nfunc popLast() -> Int {\npop(isFront: false)\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peekFirst() -> Int? {\nisEmpty() ? nil : front?.val\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc peekLast() -> Int? {\nisEmpty() ? nil : rear?.val\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nfunc toArray() -> [Int] {\nvar node = front\nvar res = Array(repeating: 0, count: size())\nfor i in res.indices {\nres[i] = node!.val\nnode = node?.next\n}\nreturn res\n}\n}\n
linkedlist_deque.zig
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nval: T = undefined,     // \u8282\u70b9\u503c\nnext: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\nprev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\n// Initialize a list node with specific value\npub fn init(self: *Self, x: i32) void {\nself.val = x;\nself.next = null;\nself.prev = null;\n}\n};\n}\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nfront: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\nrear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\nque_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.front = null;\nself.rear = null;\nself.que_size = 0;\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.que_size;\n}\n// \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u5165\u961f\u64cd\u4f5c\npub fn push(self: *Self, num: T, is_front: bool) !void {\nvar node = try self.mem_allocator.create(ListNode(T));\nnode.init(num);\n// \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front, rear \u90fd\u6307\u5411 node\nif (self.isEmpty()) {\nself.front = node;\nself.rear = node;\n// \u961f\u9996\u5165\u961f\u64cd\u4f5c\n} else if (is_front) {\n// \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\nself.front.?.prev = node;\nnode.next = self.front;\nself.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\nself.rear.?.next = node;\nnode.prev = self.rear;\nself.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nself.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n} // \u961f\u9996\u5165\u961f\npub fn pushFirst(self: *Self, num: T) !void {\ntry self.push(num, true);\n} // \u961f\u5c3e\u5165\u961f\npub fn pushLast(self: *Self, num: T) !void {\ntry self.push(num, false);\n} // \u51fa\u961f\u64cd\u4f5c\npub fn pop(self: *Self, is_front: bool) T {\nif (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nvar val: T = undefined;\n// \u961f\u9996\u51fa\u961f\u64cd\u4f5c\nif (is_front) {\nval = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n// \u5220\u9664\u5934\u8282\u70b9\nvar fNext = self.front.?.next;\nif (fNext != null) {\nfNext.?.prev = null;\nself.front.?.next = null;\n}\nself.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n} else {\nval = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n// \u5220\u9664\u5c3e\u8282\u70b9\nvar rPrev = self.rear.?.prev;\nif (rPrev != null) {\nrPrev.?.next = null;\nself.rear.?.prev = null;\n}\nself.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n}\nself.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\nreturn val;\n} // \u961f\u9996\u51fa\u961f\npub fn popFirst(self: *Self) T {\nreturn self.pop(true);\n} // \u961f\u5c3e\u51fa\u961f\npub fn popLast(self: *Self) T {\nreturn self.pop(false);\n} // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\npub fn peekFirst(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nreturn self.front.?.val;\n}  // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\npub fn peekLast(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nreturn self.rear.?.val;\n}\n// \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\npub fn toArray(self: *Self) ![]T {\nvar node = self.front;\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nwhile (i < res.len) : (i += 1) {\nres[i] = node.?.val;\nnode = node.?.next;\n}\nreturn res;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/deque/#_2","title":"\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\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\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\u3002

ArrayDequepushLast()pushFirst()popLast()popFirst()

\u4ee5\u4e0b\u662f\u5177\u4f53\u5b9e\u73b0\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_deque.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n/* \u6784\u9020\u65b9\u6cd5 */\npublic ArrayDeque(int capacity) {\nthis.nums = new int[capacity];\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\npublic int capacity() {\nreturn nums.length;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn queSize == 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nprivate 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\nreturn (i + capacity()) % capacity();\n}\n/* \u961f\u9996\u5165\u961f */\npublic void pushFirst(int num) {\nif (queSize == capacity()) {\nSystem.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nfront = index(front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nnums[front] = num;\nqueSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\npublic void pushLast(int num) {\nif (queSize == capacity()) {\nSystem.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nint rear = index(front + queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\npublic int popFirst() {\nint num = peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfront = index(front + 1);\nqueSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\npublic int popLast() {\nint num = peekLast();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peekFirst() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int peekLast() {\nif (isEmpty())\nthrow new EmptyStackException();\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nint last = index(front + queSize - 1);\nreturn nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\npublic int[] toArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] res = new int[queSize];\nfor (int i = 0, j = front; i < queSize; i++, j++) {\nres[i] = nums[index(j)];\n}\nreturn res;\n}\n}\n
array_deque.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate:\nvector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\npublic:\n/* \u6784\u9020\u65b9\u6cd5 */\nArrayDeque(int capacity) {\nnums.resize(capacity);\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity() {\nreturn nums.size();\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty() {\nreturn queSize == 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint 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\nreturn (i + capacity()) % capacity();\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(int num) {\nif (queSize == capacity()) {\ncout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nfront = index(front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nnums[front] = num;\nqueSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(int num) {\nif (queSize == capacity()) {\ncout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nint rear = index(front + queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst() {\nint num = peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfront = index(front + 1);\nqueSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast() {\nint num = peekLast();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst() {\nif (isEmpty())\nthrow out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast() {\nif (isEmpty())\nthrow out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nint last = index(front + queSize - 1);\nreturn nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nvector<int> toVector() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvector<int> res(queSize);\nfor (int i = 0, j = front; i < queSize; i++, j++) {\nres[i] = nums[index(j)];\n}\nreturn res;\n}\n};\n
array_deque.py
class ArrayDeque:\n\"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\ndef __init__(self, capacity: int) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__nums: list[int] = [0] * capacity\nself.__front: int = 0\nself.__size: int = 0\ndef capacity(self) -> int:\n\"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\nreturn len(self.__nums)\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.__size == 0\ndef 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\nreturn (i + self.capacity()) % self.capacity()\ndef push_first(self, num: int) -> None:\n\"\"\"\u961f\u9996\u5165\u961f\"\"\"\nif self.__size == self.capacity():\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n# \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n# \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nself.__front = self.index(self.__front - 1)\n# \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nself.__nums[self.__front] = num\nself.__size += 1\ndef push_last(self, num: int) -> None:\n\"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\nif self.__size == self.capacity():\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n# \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nrear = self.index(self.__front + self.__size)\n# \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nself.__nums[rear] = num\nself.__size += 1\ndef pop_first(self) -> int:\n\"\"\"\u961f\u9996\u51fa\u961f\"\"\"\nnum = self.peek_first()\n# \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nself.__front = self.index(self.__front + 1)\nself.__size -= 1\nreturn num\ndef pop_last(self) -> int:\n\"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\nnum = self.peek_last()\nself.__size -= 1\nreturn num\ndef peek_first(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\"\nreturn self.__nums[self.__front]\ndef peek_last(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\"\n# \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nlast = self.index(self.__front + self.__size - 1)\nreturn self.__nums[last]\ndef 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\nres = []\nfor i in range(self.__size):\nres.append(self.__nums[self.index(self.__front + i)])\nreturn res\n
array_deque.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\nnums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nfront       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nqueSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\nqueCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\nreturn &arrayDeque{\nnums:        make([]int, queCapacity),\nqueCapacity: queCapacity,\nfront:       0,\nqueSize:     0,\n}\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\nreturn q.queSize\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\nreturn q.queSize == 0\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\nreturn (i + q.queCapacity) % q.queCapacity\n}\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\nif q.queSize == q.queCapacity {\nfmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nq.front = q.index(q.front - 1)\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nq.nums[q.front] = num\nq.queSize++\n}\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\nif q.queSize == q.queCapacity {\nfmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nrear := q.index(q.front + q.queSize)\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nq.nums[rear] = num\nq.queSize++\n}\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\nnum := q.peekFirst()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nq.front = q.index(q.front + 1)\nq.queSize--\nreturn num\n}\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\nnum := q.peekLast()\nq.queSize--\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\nif q.isEmpty() {\nreturn nil\n}\nreturn q.nums[q.front]\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\nif q.isEmpty() {\nreturn nil\n}\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nlast := q.index(q.front + q.queSize - 1)\nreturn q.nums[last]\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\nres := make([]int, q.queSize)\nfor i, j := 0, q.front; i < q.queSize; i++ {\nres[i] = q.nums[q.index(j)]\nj++\n}\nreturn res\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/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(capacity) {\nthis.#nums = new Array(capacity);\nthis.#front = 0;\nthis.#queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\ncapacity() {\nreturn this.#nums.length;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.#queSize === 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nindex(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\nreturn (i + this.capacity()) % this.capacity();\n}\n/* \u961f\u9996\u5165\u961f */\npushFirst(num) {\nif (this.#queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nthis.#front = this.index(this.#front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nthis.#nums[this.#front] = num;\nthis.#queSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\npushLast(num) {\nif (this.#queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nconst rear = this.index(this.#front + this.#queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.#nums[rear] = num;\nthis.#queSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\npopFirst() {\nconst num = this.peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nthis.#front = this.index(this.#front + 1);\nthis.#queSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\npopLast() {\nconst num = this.peekLast();\nthis.#queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst() {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\nreturn this.#nums[this.#front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast() {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nconst last = this.index(this.#front + this.#queSize - 1);\nreturn this.#nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\ntoArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst res = [];\nfor (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\nres[i] = this.#nums[this.index(j)];\n}\nreturn res;\n}\n}\n
array_deque.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n/* \u6784\u9020\u65b9\u6cd5 */\nconstructor(capacity: number) {\nthis.nums = new Array(capacity);\nthis.front = 0;\nthis.queSize = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\ncapacity(): number {\nreturn this.nums.length;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.queSize === 0;\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nindex(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\nreturn (i + this.capacity()) % this.capacity();\n}\n/* \u961f\u9996\u5165\u961f */\npushFirst(num: number): void {\nif (this.queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nthis.front = this.index(this.front - 1);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nthis.nums[this.front] = num;\nthis.queSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\npushLast(num: number): void {\nif (this.queSize === this.capacity()) {\nconsole.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nconst rear: number = this.index(this.front + this.queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.nums[rear] = num;\nthis.queSize++;\n}\n/* \u961f\u9996\u51fa\u961f */\npopFirst(): number {\nconst num: number = this.peekFirst();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nthis.front = this.index(this.front + 1);\nthis.queSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\npopLast(): number {\nconst num: number = this.peekLast();\nthis.queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeekFirst(): number {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\nreturn this.nums[this.front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npeekLast(): number {\nif (this.isEmpty()) throw new Error('The Deque Is Empty.');\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nconst last = this.index(this.front + this.queSize - 1);\nreturn this.nums[last];\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\ntoArray(): number[] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst res: number[] = [];\nfor (let i = 0, j = this.front; i < this.queSize; i++, j++) {\nres[i] = this.nums[this.index(j)];\n}\nreturn res;\n}\n}\n
array_deque.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct arrayDeque {\nint *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\nint queCapacity; // \u961f\u5217\u5bb9\u91cf\n};\n/* \u6784\u9020\u51fd\u6570 */\narrayDeque *newArrayDeque(int capacity) {\narrayDeque *deque = (arrayDeque *)malloc(sizeof(arrayDeque));\n// \u521d\u59cb\u5316\u6570\u7ec4\ndeque->queCapacity = capacity;\ndeque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\ndeque->front = deque->queSize = 0;\nreturn deque;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(arrayDeque *deque) {\nfree(deque->nums);\ndeque->queCapacity = 0;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(arrayDeque *deque) {\nreturn deque->queCapacity;\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(arrayDeque *deque) {\nreturn deque->queSize;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(arrayDeque *deque) {\nreturn deque->queSize == 0;\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(arrayDeque *deque) {\nreturn deque->queSize == 0;\n}\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\nreturn ((i + capacity(deque)) % capacity(deque));\n}\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(arrayDeque *deque, int num) {\nif (deque->queSize == capacity(deque)) {\nprintf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\nreturn;\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\ndeque->front = dequeIndex(deque, deque->front - 1);\n// \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\ndeque->nums[deque->front] = num;\ndeque->queSize++;\n}\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(arrayDeque *deque, int num) {\nif (deque->queSize == capacity(deque)) {\nprintf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nint rear = dequeIndex(deque, deque->front + deque->queSize);\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque->nums[rear] = num;\ndeque->queSize++;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(arrayDeque *deque) {\n// \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\nassert(empty(deque) == 0);\nreturn deque->nums[deque->front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(arrayDeque *deque) {\n// \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\nassert(empty(deque) == 0);\nint last = dequeIndex(deque, deque->front + deque->queSize - 1);\nreturn deque->nums[last];\n}\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(arrayDeque *deque) {\nint num = peekFirst(deque);\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\ndeque->front = dequeIndex(deque, deque->front + 1);\ndeque->queSize--;\nreturn num;\n}\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(arrayDeque *deque) {\nint num = peekLast(deque);\ndeque->queSize--;\nreturn num;\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printArrayDeque(arrayDeque *deque) {\nint arr[deque->queSize];\n// \u62f7\u8d1d\nfor (int i = 0, j = deque->front; i < deque->queSize; i++, j++) {\narr[i] = deque->nums[j % deque->queCapacity];\n}\nprintArray(arr, deque->queSize);\n}\n
array_deque.cs
[class]{ArrayDeque}-[func]{}\n
array_deque.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate var queSize: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n/* \u6784\u9020\u65b9\u6cd5 */\ninit(capacity: Int) {\nnums = Array(repeating: 0, count: capacity)\nfront = 0\nqueSize = 0\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nfunc capacity() -> Int {\nnums.count\n}\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nqueSize\n}\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nprivate 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/* \u961f\u9996\u5165\u961f */\nfunc pushFirst(num: Int) {\nif size() == capacity() {\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\nfront = index(i: front - 1)\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\nnums[front] = num\nqueSize += 1\n}\n/* \u961f\u5c3e\u5165\u961f */\nfunc pushLast(num: Int) {\nif size() == capacity() {\nprint(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\nlet rear = index(i: front + size())\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num\nqueSize += 1\n}\n/* \u961f\u9996\u51fa\u961f */\nfunc popFirst() -> Int {\nlet num = peekFirst()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\nfront = index(i: front + 1)\nqueSize -= 1\nreturn num\n}\n/* \u961f\u5c3e\u51fa\u961f */\nfunc popLast() -> Int {\nlet num = peekLast()\nqueSize -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peekFirst() -> Int {\nif isEmpty() {\nfatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n}\nreturn nums[front]\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc peekLast() -> Int {\nif isEmpty() {\nfatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n}\n// \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\nlet last = index(i: front + size() - 1)\nreturn nums[last]\n}\n/* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\nfunc toArray() -> [Int] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar res = Array(repeating: 0, count: size())\nfor (i, j) in sequence(first: (0, front), next: { $0 < self.size() - 1 ? ($0 + 1, $1 + 1) : nil }) {\nres[i] = nums[index(i: j)]\n}\nreturn res\n}\n}\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\u5373\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":"

\u300c\u961f\u5217 Queue\u300d\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\uff08First In, First Out\uff09\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\u7684\u5c3e\u90e8\uff0c\u800c\u4f4d\u4e8e\u961f\u5217\u5934\u90e8\u7684\u4eba\u9010\u4e2a\u79bb\u5f00\u3002

\u6211\u4eec\u628a\u961f\u5217\u7684\u5934\u90e8\u79f0\u4e3a\u300c\u961f\u9996\u300d\uff0c\u5c3e\u90e8\u79f0\u4e3a\u300c\u961f\u5c3e\u300d\uff0c\u628a\u5c06\u5143\u7d20\u52a0\u5165\u961f\u5c3e\u7684\u64cd\u4f5c\u79f0\u4e3a\u300c\u5165\u961f\u300d\uff0c\u5220\u9664\u961f\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u79f0\u4e3a\u300c\u51fa\u961f\u300d\u3002

Fig. \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\u4e0b\u8868\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

\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig queue.java
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.peek();\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.poll();\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
queue.cpp
/* \u521d\u59cb\u5316\u961f\u5217 */\nqueue<int> queue;\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint front = queue.front();\n/* \u5143\u7d20\u51fa\u961f */\nqueue.pop();\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = queue.empty();\n
queue.py
# \u521d\u59cb\u5316\u961f\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u5c06\u53cc\u5411\u961f\u5217\u7c7b deque \u770b\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\u5efa\u8bae\nque: Deque[int] = collections.deque()\n# \u5143\u7d20\u5165\u961f\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n# \u8bbf\u95ee\u961f\u9996\u5143\u7d20\nfront: int = que[0];\n# \u5143\u7d20\u51fa\u961f\npop: int = que.popleft()\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(que)\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(que) == 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/* \u5143\u7d20\u5165\u961f */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek := queue.Front()\n/* \u5143\u7d20\u51fa\u961f */\npop := queue.Front()\nqueue.Remove(pop)\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nsize := queue.Len()\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := queue.Len() == 0\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/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\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/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\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/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\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/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
queue.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u961f\u5217\n
queue.cs
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<int> queue = new();\n/* \u5143\u7d20\u5165\u961f */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.Dequeue();\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.Count();\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.Count() == 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/* \u5143\u7d20\u5165\u961f */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nlet peek = queue.first!\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/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = queue.count\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = queue.isEmpty\n
queue.zig
\n
"},{"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\u3002\u56e0\u6b64\uff0c\u94fe\u8868\u548c\u6570\u7ec4\u90fd\u53ef\u4ee5\u7528\u6765\u5b9e\u73b0\u961f\u5217\u3002

"},{"location":"chapter_stack_and_queue/queue/#_1","title":"\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u5bf9\u4e8e\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u300c\u5934\u8282\u70b9\u300d\u548c\u300c\u5c3e\u8282\u70b9\u300d\u5206\u522b\u89c6\u4e3a\u961f\u9996\u548c\u961f\u5c3e\uff0c\u89c4\u5b9a\u961f\u5c3e\u4ec5\u53ef\u6dfb\u52a0\u8282\u70b9\uff0c\u800c\u961f\u9996\u4ec5\u53ef\u5220\u9664\u8282\u70b9\u3002

LinkedListQueuepush()pop()

\u4ee5\u4e0b\u662f\u7528\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u793a\u4f8b\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linkedlist_queue.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nprivate int queSize = 0;\npublic LinkedListQueue() {\nfront = null;\nrear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f */\npublic void push(int num) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nListNode 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\nif (front == null) {\nfront = node;\nrear = node;\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n} else {\nrear.next = node;\nrear = node;\n}\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop() {\nint num = peek();\n// \u5220\u9664\u5934\u8282\u70b9\nfront = front.next;\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek() {\nif (size() == 0)\nthrow new EmptyStackException();\nreturn front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\nListNode node = front;\nint[] res = new int[size()];\nfor (int i = 0; i < res.length; i++) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate:\nListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\nint queSize;\npublic:\nLinkedListQueue() {\nfront = nullptr;\nrear = nullptr;\nqueSize = 0;\n}\n~LinkedListQueue() {\n// \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\nfreeMemoryLinkedList(front);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn queSize == 0;\n}\n/* \u5165\u961f */\nvoid push(int num) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nListNode *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\nif (front == nullptr) {\nfront = node;\nrear = node;\n}\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse {\nrear->next = node;\nrear = node;\n}\nqueSize++;\n}\n/* \u51fa\u961f */\nvoid pop() {\nint num = peek();\n// \u5220\u9664\u5934\u8282\u70b9\nListNode *tmp = front;\nfront = front->next;\n// \u91ca\u653e\u5185\u5b58\ndelete tmp;\nqueSize--;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek() {\nif (size() == 0)\nthrow out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn front->val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\nvector<int> toVector() {\nListNode *node = front;\nvector<int> res(size());\nfor (int i = 0; i < res.size(); i++) {\nres[i] = node->val;\nnode = node->next;\n}\nreturn res;\n}\n};\n
linkedlist_queue.py
class LinkedListQueue:\n\"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__front: ListNode | None = None  # \u5934\u8282\u70b9 front\nself.__rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\nself.__size: int = 0\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn not self.__front\ndef push(self, num: int) -> None:\n\"\"\"\u5165\u961f\"\"\"\n# \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nnode = ListNode(num)\n# \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\nif self.__front is None:\nself.__front = node\nself.__rear = node\n# \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse:\nself.__rear.next = node\nself.__rear = node\nself.__size += 1\ndef pop(self) -> int:\n\"\"\"\u51fa\u961f\"\"\"\nnum = self.peek()\n# \u5220\u9664\u5934\u8282\u70b9\nself.__front = self.__front.next\nself.__size -= 1\nreturn num\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nif self.size() == 0:\nprint(\"\u961f\u5217\u4e3a\u7a7a\")\nreturn False\nreturn self.__front.val\ndef to_list(self) -> list[int]:\n\"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\nqueue = []\ntemp = self.__front\nwhile temp:\nqueue.append(temp.val)\ntemp = temp.next\nreturn queue\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\ndata *list.List\n}\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\nreturn &linkedListQueue{\ndata: list.New(),\n}\n}\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\ns.data.PushBack(value)\n}\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Front()\nreturn e.Value\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\nreturn s.data.Len()\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\nreturn s.data.Len() == 0\n}\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\nreturn s.data\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;\nconstructor() {\nthis.#front = null;\nthis.#rear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.size === 0;\n}\n/* \u5165\u961f */\npush(num) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nconst 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\nif (!this.#front) {\nthis.#front = node;\nthis.#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 {\nthis.#rear.next = node;\nthis.#rear = node;\n}\nthis.#queSize++;\n}\n/* \u51fa\u961f */\npop() {\nconst num = this.peek();\n// \u5220\u9664\u5934\u8282\u70b9\nthis.#front = this.#front.next;\nthis.#queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek() {\nif (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.#front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray() {\nlet node = this.#front;\nconst res = new Array(this.size);\nfor (let i = 0; i < res.length; i++) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate front: ListNode | null; // \u5934\u8282\u70b9 front\nprivate rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\nprivate queSize: number = 0;\nconstructor() {\nthis.front = null;\nthis.rear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.size === 0;\n}\n/* \u5165\u961f */\npush(num: number): void {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nconst 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\nif (!this.front) {\nthis.front = node;\nthis.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 {\nthis.rear!.next = node;\nthis.rear = node;\n}\nthis.queSize++;\n}\n/* \u51fa\u961f */\npop(): number {\nconst num = this.peek();\nif (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n// \u5220\u9664\u5934\u8282\u70b9\nthis.front = this.front.next;\nthis.queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek(): number {\nif (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.front!.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray(): number[] {\nlet node = this.front;\nconst res = new Array<number>(this.size);\nfor (let i = 0; i < res.length; i++) {\nres[i] = node!.val;\nnode = node!.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct linkedListQueue {\nListNode *front, *rear;\nint queSize;\n};\n/* \u6784\u9020\u51fd\u6570 */\nlinkedListQueue *newLinkedListQueue() {\nlinkedListQueue *queue = (linkedListQueue *)malloc(sizeof(linkedListQueue));\nqueue->front = NULL;\nqueue->rear = NULL;\nqueue->queSize = 0;\nreturn queue;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(linkedListQueue *queue) {\n// \u91ca\u653e\u6240\u6709\u8282\u70b9\nfor (int i = 0; i < queue->queSize && queue->front != NULL; i++) {\nListNode *tmp = queue->front;\nqueue->front = queue->front->next;\nfree(tmp);\n}\n// \u91ca\u653e queue \u7ed3\u6784\u4f53\nfree(queue);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(linkedListQueue *queue) {\nreturn queue->queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(linkedListQueue *queue) {\nreturn (size(queue) == 0);\n}\n/* \u5165\u961f */\nvoid push(linkedListQueue *queue, int num) {\n// \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\nListNode *node = newListNode(num);\n// \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\nif (queue->front == NULL) {\nqueue->front = node;\nqueue->rear = node;\n}\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse {\nqueue->rear->next = node;\nqueue->rear = node;\n}\nqueue->queSize++;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(linkedListQueue *queue) {\nassert(size(queue) && queue->front);\nreturn queue->front->val;\n}\n/* \u51fa\u961f */\nvoid pop(linkedListQueue *queue) {\nint num = peek(queue);\nListNode *tmp = queue->front;\nqueue->front = queue->front->next;\nfree(tmp);\nqueue->queSize--;\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(linkedListQueue *queue) {\nint arr[queue->queSize];\n// \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\nint i;\nListNode *node;\nfor (i = 0, node = queue->front; i < queue->queSize && queue->front != queue->rear; i++) {\narr[i] = node->val;\nnode = node->next;\n}\nprintArray(arr, queue->queSize);\n}\n
linkedlist_queue.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue\n{\nprivate ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \nprivate int queSize = 0;\npublic LinkedListQueue()\n{\nfront = null;\nrear = null;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn size() == 0;\n}\n/* \u5165\u961f */\npublic void push(int num)\n{\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nListNode 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\nif (front == null)\n{\nfront = node;\nrear = node;\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n}\nelse if (rear != null)\n{\nrear.next = node;\nrear = node;\n}\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop()\n{\nint num = peek();\n// \u5220\u9664\u5934\u8282\u70b9\nfront = front?.next;\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek()\n{\nif (size() == 0 || front == null)\nthrow new Exception();\nreturn front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray()\n{\nif (front == null)\nreturn Array.Empty<int>();\nListNode node = front;\nint[] res = new int[size()];\nfor (int i = 0; i < res.Length; i++)\n{\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_queue.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\nprivate var front: ListNode? // \u5934\u8282\u70b9\nprivate var rear: ListNode? // \u5c3e\u8282\u70b9\nprivate var _size = 0\ninit() {}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\n_size\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u5165\u961f */\nfunc push(num: Int) {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nlet 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\nif front == nil {\nfront = node\nrear = node\n}\n// \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\nelse {\nrear?.next = node\nrear = node\n}\n_size += 1\n}\n/* \u51fa\u961f */\n@discardableResult\nfunc pop() -> Int {\nlet num = peek()\n// \u5220\u9664\u5934\u8282\u70b9\nfront = front?.next\n_size -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n}\nreturn front!.val\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nfunc toArray() -> [Int] {\nvar node = front\nvar res = Array(repeating: 0, count: size())\nfor i in res.indices {\nres[i] = node!.val\nnode = node?.next\n}\nreturn res\n}\n}\n
linkedlist_queue.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nfront: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\nrear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\nque_size: usize = 0,                             // \u961f\u5217\u7684\u957f\u5ea6\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.front = null;\nself.rear = null;\nself.que_size = 0;\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.que_size;\n}\n// \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u8bbf\u95ee\u961f\u9996\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn self.front.?.val;\n}  // \u5165\u961f\npub fn push(self: *Self, num: T) !void {\n// \u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\nvar node = try self.mem_allocator.create(inc.ListNode(T));\nnode.init(num);\n// \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\nif (self.front == null) {\nself.front = node;\nself.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 {\nself.rear.?.next = node;\nself.rear = node;\n}\nself.que_size += 1;\n} // \u51fa\u961f\npub fn pop(self: *Self) T {\nvar num = self.peek();\n// \u5220\u9664\u5934\u8282\u70b9\nself.front = self.front.?.next;\nself.que_size -= 1;\nreturn num;\n} // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\nvar node = self.front;\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nwhile (i < res.len) : (i += 1) {\nres[i] = node.?.val;\nnode = node.?.next;\n}\nreturn res;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/queue/#_2","title":"\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u7531\u4e8e\u6570\u7ec4\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 queSize \u7528\u4e8e\u8bb0\u5f55\u961f\u5217\u957f\u5ea6\u3002\u5b9a\u4e49 rear = front + queSize \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\u8fdb\u800c\uff1a

  • \u5bf9\u4e8e\u5165\u961f\u64cd\u4f5c\uff0c\u5c06\u8f93\u5165\u5143\u7d20\u8d4b\u503c\u7ed9 rear \u7d22\u5f15\u5904\uff0c\u5e76\u5c06 queSize \u589e\u52a0 1 \uff1b
  • \u5bf9\u4e8e\u51fa\u961f\u64cd\u4f5c\uff0c\u53ea\u9700\u5c06 front \u589e\u52a0 1 \uff0c\u5e76\u5c06 queSize \u51cf\u5c11 1 \uff1b

\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()

\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\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u89c6\u4e3a\u9996\u5c3e\u76f8\u63a5\u7684\u300c\u73af\u5f62\u6570\u7ec4\u300d\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_queue.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate int queSize; // \u961f\u5217\u957f\u5ea6\npublic ArrayQueue(int capacity) {\nnums = new int[capacity];\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\npublic int capacity() {\nreturn nums.length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn queSize == 0;\n}\n/* \u5165\u961f */\npublic void push(int num) {\nif (queSize == capacity()) {\nSystem.out.println(\"\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (front + queSize) % capacity();\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop() {\nint num = peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % capacity();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn nums[front];\n}\n/* \u8fd4\u56de\u6570\u7ec4 */\npublic int[] toArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] res = new int[queSize];\nfor (int i = 0, j = front; i < queSize; i++, j++) {\nres[i] = nums[j % capacity()];\n}\nreturn res;\n}\n}\n
array_queue.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate:\nint *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;     // \u961f\u5217\u957f\u5ea6\nint queCapacity; // \u961f\u5217\u5bb9\u91cf\npublic:\nArrayQueue(int capacity) {\n// \u521d\u59cb\u5316\u6570\u7ec4\nnums = new int[capacity];\nqueCapacity = capacity;\nfront = queSize = 0;\n}\n~ArrayQueue() {\ndelete[] nums;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity() {\nreturn queCapacity;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size() {\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn size() == 0;\n}\n/* \u5165\u961f */\nvoid push(int num) {\nif (queSize == queCapacity) {\ncout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\nreturn;\n}\n// \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (front + queSize) % queCapacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u51fa\u961f */\nvoid pop() {\nint num = peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % queCapacity;\nqueSize--;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek() {\nif (empty())\nthrow out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn nums[front];\n}\n/* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\nvector<int> toVector() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvector<int> arr(queSize);\nfor (int i = 0, j = front; i < queSize; i++, j++) {\narr[i] = nums[j % queCapacity];\n}\nreturn arr;\n}\n};\n
array_queue.py
class ArrayQueue:\n\"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\ndef __init__(self, size: int) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nself.__front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nself.__size: int = 0  # \u961f\u5217\u957f\u5ea6\ndef capacity(self) -> int:\n\"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\nreturn len(self.__nums)\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.__size == 0\ndef push(self, num: int) -> None:\n\"\"\"\u5165\u961f\"\"\"\nassert self.__size < self.capacity(), \"\u961f\u5217\u5df2\u6ee1\"\n# \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n# \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nrear: int = (self.__front + self.__size) % self.capacity()\n# \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nself.__nums[rear] = num\nself.__size += 1\ndef pop(self) -> int:\n\"\"\"\u51fa\u961f\"\"\"\nnum: int = self.peek()\n# \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nself.__front = (self.__front + 1) % self.capacity()\nself.__size -= 1\nreturn num\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u961f\u5217\u4e3a\u7a7a\"\nreturn self.__nums[self.__front]\ndef to_list(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\nres: list[int] = [0] * self.size()\nj: int = self.__front\nfor i in range(self.size()):\nres[i] = self.__nums[(j % self.capacity())]\nj += 1\nreturn res\n
array_queue.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\nnums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nfront       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nqueSize     int   // \u961f\u5217\u957f\u5ea6\nqueCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\nreturn &arrayQueue{\nnums:        make([]int, queCapacity),\nqueCapacity: queCapacity,\nfront:       0,\nqueSize:     0,\n}\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\nreturn q.queSize\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\nreturn q.queSize == 0\n}\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n// \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\nif q.queSize == q.queCapacity {\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nrear := (q.front + q.queSize) % q.queCapacity\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nq.nums[rear] = num\nq.queSize++\n}\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\nnum := q.peek()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nq.front = (q.front + 1) % q.queCapacity\nq.queSize--\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\nif q.isEmpty() {\nreturn nil\n}\nreturn q.nums[q.front]\n}\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\nrear := (q.front + q.queSize)\nif rear >= q.queCapacity {\nrear %= q.queCapacity\nreturn append(q.nums[q.front:], q.nums[:rear]...)\n}\nreturn q.nums[q.front:rear]\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\nconstructor(capacity) {\nthis.#nums = new Array(capacity);\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nget capacity() {\nreturn this.#nums.length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nempty() {\nreturn this.#queSize == 0;\n}\n/* \u5165\u961f */\npush(num) {\nif (this.size == this.capacity) {\nconsole.log('\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nconst rear = (this.#front + this.size) % this.capacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.#nums[rear] = num;\nthis.#queSize++;\n}\n/* \u51fa\u961f */\npop() {\nconst num = this.peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nthis.#front = (this.#front + 1) % this.capacity;\nthis.#queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek() {\nif (this.empty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.#nums[this.#front];\n}\n/* \u8fd4\u56de Array */\ntoArray() {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst arr = new Array(this.size);\nfor (let i = 0, j = this.#front; i < this.size; i++, j++) {\narr[i] = this.#nums[j % this.capacity];\n}\nreturn arr;\n}\n}\n
array_queue.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate queSize: number; // \u961f\u5217\u957f\u5ea6\nconstructor(capacity: number) {\nthis.nums = new Array(capacity);\nthis.front = this.queSize = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nget capacity(): number {\nreturn this.nums.length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nempty(): boolean {\nreturn this.queSize == 0;\n}\n/* \u5165\u961f */\npush(num: number): void {\nif (this.size == this.capacity) {\nconsole.log('\u961f\u5217\u5df2\u6ee1');\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nconst rear = (this.front + this.queSize) % this.capacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nthis.nums[rear] = num;\nthis.queSize++;\n}\n/* \u51fa\u961f */\npop(): number {\nconst num = this.peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nthis.front = (this.front + 1) % this.capacity;\nthis.queSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek(): number {\nif (this.empty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\nreturn this.nums[this.front];\n}\n/* \u8fd4\u56de Array */\ntoArray(): number[] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nconst arr = new Array(this.size);\nfor (let i = 0, j = this.front; i < this.size; i++, j++) {\narr[i] = this.nums[j % this.capacity];\n}\nreturn arr;\n}\n}\n
array_queue.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct arrayQueue {\nint *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nint front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nint queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\nint queCapacity; // \u961f\u5217\u5bb9\u91cf\n};\n/* \u6784\u9020\u51fd\u6570 */\narrayQueue *newArrayQueue(int capacity) {\narrayQueue *queue = (arrayQueue *)malloc(sizeof(arrayQueue));\n// \u521d\u59cb\u5316\u6570\u7ec4\nqueue->queCapacity = capacity;\nqueue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\nqueue->front = queue->queSize = 0;\nreturn queue;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(arrayQueue *queue) {\nfree(queue->nums);\nqueue->queCapacity = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(arrayQueue *queue) {\nreturn queue->queCapacity;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(arrayQueue *queue) {\nreturn queue->queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(arrayQueue *queue) {\nreturn queue->queSize == 0;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(arrayQueue *queue) {\nassert(size(queue) != 0);\nreturn queue->nums[queue->front];\n}\n/* \u5165\u961f */\nvoid push(arrayQueue *queue, int num) {\nif (size(queue) == capacity(queue)) {\nprintf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\nreturn;\n}\n// \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (queue->front + queue->queSize) % queue->queCapacity;\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nqueue->nums[rear] = num;\nqueue->queSize++;\n}\n/* \u51fa\u961f */\nvoid pop(arrayQueue *queue) {\nint num = peek(queue);\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nqueue->front = (queue->front + 1) % queue->queCapacity;\nqueue->queSize--;\n}\n/* \u6253\u5370\u961f\u5217 */\nvoid printArrayQueue(arrayQueue *queue) {\nint arr[queue->queSize];\n// \u62f7\u8d1d\nfor (int i = 0, j = queue->front; i < queue->queSize; i++, j++) {\narr[i] = queue->nums[j % queue->queCapacity];\n}\nprintArray(arr, queue->queSize);\n}\n
array_queue.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue\n{\nprivate int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate int queSize; // \u961f\u5217\u957f\u5ea6\npublic ArrayQueue(int capacity)\n{\nnums = new int[capacity];\nfront = queSize = 0;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\npublic int capacity()\n{\nreturn nums.Length;\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn queSize;\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn queSize == 0;\n}\n/* \u5165\u961f */\npublic void push(int num)\n{\nif (queSize == capacity())\n{\nConsole.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nint rear = (front + queSize) % capacity();\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num;\nqueSize++;\n}\n/* \u51fa\u961f */\npublic int pop()\n{\nint num = peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % capacity();\nqueSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int peek()\n{\nif (isEmpty())\nthrow new Exception();\nreturn nums[front];\n}\n/* \u8fd4\u56de\u6570\u7ec4 */\npublic int[] toArray()\n{\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nint[] res = new int[queSize];\nfor (int i = 0, j = front; i < queSize; i++, j++)\n{\nres[i] = nums[j % this.capacity()];\n}\nreturn res;\n}\n}\n
array_queue.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\nprivate var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\nprivate var front = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nprivate var queSize = 0 // \u961f\u5217\u957f\u5ea6\ninit(capacity: Int) {\n// \u521d\u59cb\u5316\u6570\u7ec4\nnums = Array(repeating: 0, count: capacity)\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nfunc capacity() -> Int {\nnums.count\n}\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nqueSize\n}\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nqueSize == 0\n}\n/* \u5165\u961f */\nfunc push(num: Int) {\nif size() == capacity() {\nprint(\"\u961f\u5217\u5df2\u6ee1\")\nreturn\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nlet rear = (front + queSize) % capacity()\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nnums[rear] = num\nqueSize += 1\n}\n/* \u51fa\u961f */\n@discardableResult\nfunc pop() -> Int {\nlet num = peek()\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nfront = (front + 1) % capacity()\nqueSize -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n}\nreturn nums[front]\n}\n/* \u8fd4\u56de\u6570\u7ec4 */\nfunc toArray() -> [Int] {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar res = Array(repeating: 0, count: queSize)\nfor (i, j) in sequence(first: (0, front), next: { $0 < self.queSize - 1 ? ($0 + 1, $1 + 1) : nil }) {\nres[i] = nums[j % capacity()]\n}\nreturn res\n}\n}\n
array_queue.zig
// \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nnums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \ncap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\nfront: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\nque_size: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.cap = cap;\nself.nums = try self.mem_allocator.alloc(T, self.cap);\nstd.mem.set(T, self.nums, @as(T, 0));\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\npub fn capacity(self: *Self) usize {\nreturn self.cap;\n}\n// \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.que_size;\n}\n// \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.que_size == 0;\n}\n// \u5165\u961f\npub fn push(self: *Self, num: T) !void {\nif (self.size() == self.capacity()) {\nstd.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\nreturn;\n}\n// \u8ba1\u7b97\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n// \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\uff0c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\nvar rear = (self.front + self.que_size) % self.capacity();\n// \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\nself.nums[rear] = num;\nself.que_size += 1;\n} // \u51fa\u961f\npub fn pop(self: *Self) T {\nvar num = self.peek();\n// \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\nself.front = (self.front + 1) % self.capacity();\nself.que_size -= 1;\nreturn num;\n} // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\nreturn self.nums[self.front];\n} // \u8fd4\u56de\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\n// \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nvar j: usize = self.front;\nwhile (i < self.size()) : ({ i += 1; j += 1; }) {\nres[i] = self.nums[j % self.capacity()];\n}\nreturn res;\n}\n};\n}\n

\u4ee5\u4e0a\u5b9e\u73b0\u7684\u961f\u5217\u4ecd\u7136\u5177\u6709\u5c40\u9650\u6027\uff0c\u5373\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\u540c\u5b66\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\u4f9d\u6b21\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\u3002\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":"

\u300c\u6808 Stack\u300d\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\uff08First In, Last Out\uff09\u539f\u5219\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\u9700\u8981\u62ff\u51fa\u5e95\u90e8\u7684\u76d8\u5b50\uff0c\u5219\u9700\u8981\u5148\u5c06\u4e0a\u9762\u7684\u76d8\u5b50\u4f9d\u6b21\u53d6\u51fa\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\u6570\u636e\u7ed3\u6784\u3002

\u5728\u6808\u4e2d\uff0c\u6211\u4eec\u628a\u5806\u53e0\u5143\u7d20\u7684\u9876\u90e8\u79f0\u4e3a\u300c\u6808\u9876\u300d\uff0c\u5e95\u90e8\u79f0\u4e3a\u300c\u6808\u5e95\u300d\u3002\u5c06\u628a\u5143\u7d20\u6dfb\u52a0\u5230\u6808\u9876\u7684\u64cd\u4f5c\u53eb\u505a\u300c\u5165\u6808\u300d\uff0c\u800c\u5220\u9664\u6808\u9876\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u505a\u300c\u51fa\u6808\u300d\u3002

Fig. \u6808\u7684\u5148\u5165\u540e\u51fa\u89c4\u5219

"},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1. \u00a0 \u6808\u5e38\u7528\u64cd\u4f5c","text":"

\u6808\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u4e0b\u8868\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() , pop() , peek() \u547d\u540d\u4e3a\u4f8b\u3002

\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\u300c\u6570\u7ec4\u300d\u6216\u300c\u94fe\u8868\u300d\u89c6\u4f5c\u6808\u6765\u4f7f\u7528\uff0c\u5e76\u901a\u8fc7\u201c\u8111\u8865\u201d\u6765\u5ffd\u7565\u4e0e\u6808\u65e0\u5173\u7684\u64cd\u4f5c\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig stack.java
/* \u521d\u59cb\u5316\u6808 */\nStack<Integer> stack = new Stack<>();\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.peek();\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
stack.cpp
/* \u521d\u59cb\u5316\u6808 */\nstack<int> stack;\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top = stack.top();\n/* \u5143\u7d20\u51fa\u6808 */\nstack.pop(); // \u65e0\u8fd4\u56de\u503c\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool empty = stack.empty();\n
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# \u5143\u7d20\u5165\u6808\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek: int = stack[-1]\n# \u5143\u7d20\u51fa\u6808\npop: int = stack.pop()\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize: int = len(stack)\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(stack) == 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/* \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/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek := stack[len(stack)-1]\n/* \u5143\u7d20\u51fa\u6808 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nsize := len(stack)\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(stack) == 0\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/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\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/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u6808\n
stack.cs
/* \u521d\u59cb\u5316\u6808 */\nStack<int> stack = new ();\n/* \u5143\u7d20\u5165\u6808 */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.Peek();\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.Pop();\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.Count();\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.Count()==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/* \u5143\u7d20\u5165\u6808 */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet peek = stack.last!\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.removeLast()\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.count\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = stack.isEmpty\n
stack.zig
\n
"},{"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\u88ab\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":"\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u4f7f\u7528\u94fe\u8868\u6765\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

\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()

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u793a\u4f8b\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig linkedlist_stack.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate int stkSize = 0; // \u6808\u7684\u957f\u5ea6\npublic LinkedListStack() {\nstackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size() {\nreturn stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num) {\nListNode node = new ListNode(num);\nnode.next = stackPeek;\nstackPeek = node;\nstkSize++;\n}\n/* \u51fa\u6808 */\npublic int pop() {\nint num = peek();\nstackPeek = stackPeek.next;\nstkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (size() == 0)\nthrow new EmptyStackException();\nreturn stackPeek.val;\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\nListNode node = stackPeek;\nint[] res = new int[size()];\nfor (int i = res.length - 1; i >= 0; i--) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate:\nListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nint stkSize;        // \u6808\u7684\u957f\u5ea6\npublic:\nLinkedListStack() {\nstackTop = nullptr;\nstkSize = 0;\n}\n~LinkedListStack() {\n// \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\nfreeMemoryLinkedList(stackTop);\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size() {\nreturn stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn size() == 0;\n}\n/* \u5165\u6808 */\nvoid push(int num) {\nListNode *node = new ListNode(num);\nnode->next = stackTop;\nstackTop = node;\nstkSize++;\n}\n/* \u51fa\u6808 */\nvoid pop() {\nint num = top();\nListNode *tmp = stackTop;\nstackTop = stackTop->next;\n// \u91ca\u653e\u5185\u5b58\ndelete tmp;\nstkSize--;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top() {\nif (size() == 0)\nthrow out_of_range(\"\u6808\u4e3a\u7a7a\");\nreturn stackTop->val;\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nvector<int> toVector() {\nListNode *node = stackTop;\nvector<int> res(size());\nfor (int i = res.size() - 1; i >= 0; i--) {\nres[i] = node->val;\nnode = node->next;\n}\nreturn res;\n}\n};\n
linkedlist_stack.py
class LinkedListStack:\n\"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\ndef __init__(self):\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__peek: ListNode | None = None\nself.__size: int = 0\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\nreturn self.__size\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn not self.__peek\ndef push(self, val: int) -> None:\n\"\"\"\u5165\u6808\"\"\"\nnode = ListNode(val)\nnode.next = self.__peek\nself.__peek = node\nself.__size += 1\ndef pop(self) -> int:\n\"\"\"\u51fa\u6808\"\"\"\nnum: int = self.peek()\nself.__peek = self.__peek.next\nself.__size -= 1\nreturn num\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n# \u5224\u7a7a\u5904\u7406\nif not self.__peek:\nreturn None\nreturn self.__peek.val\ndef to_list(self) -> list[int]:\n\"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\narr: list[int] = []\nnode = self.__peek\nwhile node:\narr.append(node.val)\nnode = node.next\narr.reverse()\nreturn arr\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\ndata *list.List\n}\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\nreturn &linkedListStack{\ndata: list.New(),\n}\n}\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\ns.data.PushBack(value)\n}\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\ns.data.Remove(e)\nreturn e.Value\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\nif s.isEmpty() {\nreturn nil\n}\ne := s.data.Back()\nreturn e.Value\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\nreturn s.data.Len()\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\nreturn s.data.Len() == 0\n}\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\nreturn s.data\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\nconstructor() {\nthis.#stackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nisEmpty() {\nreturn this.size == 0;\n}\n/* \u5165\u6808 */\npush(num) {\nconst node = new ListNode(num);\nnode.next = this.#stackPeek;\nthis.#stackPeek = node;\nthis.#stkSize++;\n}\n/* \u51fa\u6808 */\npop() {\nconst num = this.peek();\nthis.#stackPeek = this.#stackPeek.next;\nthis.#stkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek() {\nif (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.#stackPeek.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray() {\nlet node = this.#stackPeek;\nconst res = new Array(this.size);\nfor (let i = res.length - 1; i >= 0; i--) {\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\nconstructor() {\nthis.stackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nisEmpty(): boolean {\nreturn this.size == 0;\n}\n/* \u5165\u6808 */\npush(num: number): void {\nconst node = new ListNode(num);\nnode.next = this.stackPeek;\nthis.stackPeek = node;\nthis.stkSize++;\n}\n/* \u51fa\u6808 */\npop(): number {\nconst num = this.peek();\nif (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\nthis.stackPeek = this.stackPeek.next;\nthis.stkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek(): number {\nif (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.stackPeek.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\ntoArray(): number[] {\nlet node = this.stackPeek;\nconst res = new Array<number>(this.size);\nfor (let i = res.length - 1; i >= 0; i--) {\nres[i] = node!.val;\nnode = node!.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nstruct linkedListStack {\nListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nint size;      // \u6808\u7684\u957f\u5ea6\n};\n/* \u6784\u9020\u51fd\u6570 */\nlinkedListStack *newLinkedListStack() {\nlinkedListStack *s = malloc(sizeof(linkedListStack));\ns->top = NULL;\ns->size = 0;\nreturn s;\n}\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(linkedListStack *s) {\nwhile (s->top) {\nListNode *n = s->top->next;\nfree(s->top);\ns->top = n;\n}\nfree(s);\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(linkedListStack *s) {\nassert(s);\nreturn s->size;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(linkedListStack *s) {\nassert(s);\nreturn size(s) == 0;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(linkedListStack *s) {\nassert(s);\nassert(size(s) != 0);\nreturn s->top->val;\n}\n/* \u5165\u6808 */\nvoid push(linkedListStack *s, int num) {\nassert(s);\nListNode *node = (ListNode *)malloc(sizeof(ListNode));\nnode->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\nnode->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\ns->top = node;       // \u66f4\u65b0\u6808\u9876\ns->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n/* \u51fa\u6808 */\nint pop(linkedListStack *s) {\nif (s->size == 0) {\nprintf(\"stack is empty.\\n\");\nreturn INT_MAX;\n}\nassert(s);\nint val = peek(s);\nListNode *tmp = s->top;\ns->top = s->top->next;\n// \u91ca\u653e\u5185\u5b58\nfree(tmp);\ns->size--;\nreturn val;\n}\n
linkedlist_stack.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack\n{\nprivate ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\npublic LinkedListStack()\n{\nstackPeek = null;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn stkSize;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num)\n{\nListNode node = new ListNode(num);\nnode.next = stackPeek;\nstackPeek = node;\nstkSize++;\n}\n/* \u51fa\u6808 */\npublic int pop()\n{\nif (stackPeek == null)\nthrow new Exception();\nint num = peek();\nstackPeek = stackPeek.next;\nstkSize--;\nreturn num;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek()\n{\nif (size() == 0 || stackPeek == null)\nthrow new Exception();\nreturn stackPeek.val;\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray()\n{\nif (stackPeek == null)\nreturn Array.Empty<int>();\nListNode node = stackPeek;\nint[] res = new int[size()];\nfor (int i = res.Length - 1; i >= 0; i--)\n{\nres[i] = node.val;\nnode = node.next;\n}\nreturn res;\n}\n}\n
linkedlist_stack.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\nprivate var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nprivate var _size = 0 // \u6808\u7684\u957f\u5ea6\ninit() {}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc size() -> Int {\n_size\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nsize() == 0\n}\n/* \u5165\u6808 */\nfunc push(num: Int) {\nlet node = ListNode(x: num)\nnode.next = _peek\n_peek = node\n_size += 1\n}\n/* \u51fa\u6808 */\n@discardableResult\nfunc pop() -> Int {\nlet num = peek()\n_peek = _peek?.next\n_size -= 1\nreturn num\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u6808\u4e3a\u7a7a\")\n}\nreturn _peek!.val\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nfunc toArray() -> [Int] {\nvar node = _peek\nvar res = Array(repeating: 0, count: _size)\nfor i in sequence(first: res.count - 1, next: { $0 >= 0 + 1 ? $0 - 1 : nil }) {\nres[i] = node!.val\nnode = node?.next\n}\nreturn res\n}\n}\n
linkedlist_stack.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nstack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\nstk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\nmem_arena: ?std.heap.ArenaAllocator = null,\nmem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n// \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) !void {\nif (self.mem_arena == null) {\nself.mem_arena = std.heap.ArenaAllocator.init(allocator);\nself.mem_allocator = self.mem_arena.?.allocator();\n}\nself.stack_top = null;\nself.stk_size = 0;\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.mem_arena == null) return;\nself.mem_arena.?.deinit();\n}\n// \u83b7\u53d6\u6808\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.stk_size;\n}\n// \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\nreturn self.stack_top.?.val;\n}  // \u5165\u6808\npub fn push(self: *Self, num: T) !void {\nvar node = try self.mem_allocator.create(inc.ListNode(T));\nnode.init(num);\nnode.next = self.stack_top;\nself.stack_top = node;\nself.stk_size += 1;\n} // \u51fa\u6808\npub fn pop(self: *Self) T {\nvar num = self.peek();\nself.stack_top = self.stack_top.?.next;\nself.stk_size -= 1;\nreturn num;\n} // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\npub fn toArray(self: *Self) ![]T {\nvar node = self.stack_top;\nvar res = try self.mem_allocator.alloc(T, self.size());\nstd.mem.set(T, res, @as(T, 0));\nvar i: usize = 0;\nwhile (i < res.len) : (i += 1) {\nres[res.len - i - 1] = node.?.val;\nnode = node.?.next;\n}\nreturn res;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/stack/#_2","title":"\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u5728\u57fa\u4e8e\u300c\u6570\u7ec4\u300d\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u7684\u5c3e\u90e8\u4f5c\u4e3a\u6808\u9876\u3002\u5728\u8fd9\u6837\u7684\u8bbe\u8ba1\u4e0b\uff0c\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u5c31\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()

\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\u9700\u81ea\u884c\u5904\u7406\u6570\u7ec4\u6269\u5bb9\u95ee\u9898\u3002\u4ee5\u4e0b\u4e3a\u793a\u4f8b\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig array_stack.java
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate ArrayList<Integer> stack;\npublic ArrayStack() {\n// \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\nstack = new ArrayList<>();\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size() {\nreturn stack.size();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic boolean isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num) {\nstack.add(num);\n}\n/* \u51fa\u6808 */\npublic int pop() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn stack.remove(size() - 1);\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new EmptyStackException();\nreturn stack.get(size() - 1);\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic Object[] toArray() {\nreturn stack.toArray();\n}\n}\n
array_stack.cpp
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate:\nvector<int> stack;\npublic:\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size() {\nreturn stack.size();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool empty() {\nreturn stack.empty();\n}\n/* \u5165\u6808 */\nvoid push(int num) {\nstack.push_back(num);\n}\n/* \u51fa\u6808 */\nvoid pop() {\nint oldTop = top();\nstack.pop_back();\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top() {\nif (empty())\nthrow out_of_range(\"\u6808\u4e3a\u7a7a\");\nreturn stack.back();\n}\n/* \u8fd4\u56de Vector */\nvector<int> toVector() {\nreturn stack;\n}\n};\n
array_stack.py
class ArrayStack:\n\"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\ndef __init__(self) -> None:\n\"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\nself.__stack: list[int] = []\ndef size(self) -> int:\n\"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\nreturn len(self.__stack)\ndef is_empty(self) -> bool:\n\"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\nreturn self.__stack == []\ndef push(self, item: int) -> None:\n\"\"\"\u5165\u6808\"\"\"\nself.__stack.append(item)\ndef pop(self) -> int:\n\"\"\"\u51fa\u6808\"\"\"\nassert not self.is_empty(), \"\u6808\u4e3a\u7a7a\"\nreturn self.__stack.pop()\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\nassert not self.is_empty(), \"\u6808\u4e3a\u7a7a\"\nreturn self.__stack[-1]\ndef to_list(self) -> list[int]:\n\"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\nreturn self.__stack\n
array_stack.go
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\ndata []int // \u6570\u636e\n}\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\nreturn &arrayStack{\n// \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\ndata: make([]int, 0, 16),\n}\n}\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\nreturn len(s.data)\n}\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\nreturn s.size() == 0\n}\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n// \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\ns.data = append(s.data, v)\n}\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\nval := s.peek()\ns.data = s.data[:len(s.data)-1]\nreturn val\n}\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\nif s.isEmpty() {\nreturn nil\n}\nval := s.data[len(s.data)-1]\nreturn val\n}\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\nreturn s.data\n}\n
array_stack.js
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n#stack;\nconstructor() {\nthis.#stack = [];\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size() {\nreturn this.#stack.length;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nempty() {\nreturn this.#stack.length === 0;\n}\n/* \u5165\u6808 */\npush(num) {\nthis.#stack.push(num);\n}\n/* \u51fa\u6808 */\npop() {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.#stack.pop();\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\ntop() {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.#stack[this.#stack.length - 1];\n}\n/* \u8fd4\u56de Array */\ntoArray() {\nreturn this.#stack;\n}\n}\n
array_stack.ts
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate stack: number[];\nconstructor() {\nthis.stack = [];\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nget size(): number {\nreturn this.stack.length;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nempty(): boolean {\nreturn this.stack.length === 0;\n}\n/* \u5165\u6808 */\npush(num: number): void {\nthis.stack.push(num);\n}\n/* \u51fa\u6808 */\npop(): number | undefined {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.stack.pop();\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\ntop(): number | undefined {\nif (this.empty()) throw new Error('\u6808\u4e3a\u7a7a');\nreturn this.stack[this.stack.length - 1];\n}\n/* \u8fd4\u56de Array */\ntoArray() {\nreturn this.stack;\n}\n}\n
array_stack.c
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct arrayStack {\nint *data;\nint size;\n};\n/* \u6784\u9020\u51fd\u6570 */\narrayStack *newArrayStack() {\narrayStack *s = malloc(sizeof(arrayStack));\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\ns->data = malloc(sizeof(int) * MAX_SIZE);\ns->size = 0;\nreturn s;\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(arrayStack *s) {\nreturn s->size;\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(arrayStack *s) {\nreturn s->size == 0;\n}\n/* \u5165\u6808 */\nvoid push(arrayStack *s, int num) {\nif (s->size == MAX_SIZE) {\nprintf(\"stack is full.\\n\");\nreturn;\n}\ns->data[s->size] = num;\ns->size++;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(arrayStack *s) {\nif (s->size == 0) {\nprintf(\"stack is empty.\\n\");\nreturn INT_MAX;\n}\nreturn s->data[s->size - 1];\n}\n/* \u51fa\u6808 */\nint pop(arrayStack *s) {\nif (s->size == 0) {\nprintf(\"stack is empty.\\n\");\nreturn INT_MAX;\n}\nint val = peek(s);\ns->size--;\nreturn val;\n}\n
array_stack.cs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack\n{\nprivate List<int> stack;\npublic ArrayStack()\n{\n// \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\nstack = new();\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\npublic int size()\n{\nreturn stack.Count();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic bool isEmpty()\n{\nreturn size() == 0;\n}\n/* \u5165\u6808 */\npublic void push(int num)\n{\nstack.Add(num);\n}\n/* \u51fa\u6808 */\npublic int pop()\n{\nif (isEmpty())\nthrow new Exception();\nvar val = peek();\nstack.RemoveAt(size() - 1);\nreturn val;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek()\n{\nif (isEmpty())\nthrow new Exception();\nreturn stack[size() - 1];\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray()\n{\nreturn stack.ToArray();\n}\n}\n
array_stack.swift
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\nprivate var stack: [Int]\ninit() {\n// \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\nstack = []\n}\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc size() -> Int {\nstack.count\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc isEmpty() -> Bool {\nstack.isEmpty\n}\n/* \u5165\u6808 */\nfunc push(num: Int) {\nstack.append(num)\n}\n/* \u51fa\u6808 */\n@discardableResult\nfunc pop() -> Int {\nif isEmpty() {\nfatalError(\"\u6808\u4e3a\u7a7a\")\n}\nreturn stack.removeLast()\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc peek() -> Int {\nif isEmpty() {\nfatalError(\"\u6808\u4e3a\u7a7a\")\n}\nreturn stack.last!\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\nfunc toArray() -> [Int] {\nstack\n}\n}\n
array_stack.zig
// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\nreturn struct {\nconst Self = @This();\nstack: ?std.ArrayList(T) = null,     // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\npub fn init(self: *Self, allocator: std.mem.Allocator) void {\nif (self.stack == null) {\nself.stack = std.ArrayList(T).init(allocator);\n}\n}\n// \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\npub fn deinit(self: *Self) void {\nif (self.stack == null) return;\nself.stack.?.deinit();\n}\n// \u83b7\u53d6\u6808\u7684\u957f\u5ea6\npub fn size(self: *Self) usize {\nreturn self.stack.?.items.len;\n}\n// \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\npub fn isEmpty(self: *Self) bool {\nreturn self.size() == 0;\n}\n// \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npub fn peek(self: *Self) T {\nif (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\nreturn self.stack.?.items[self.size() - 1];\n}  // \u5165\u6808\npub fn push(self: *Self, num: T) !void {\ntry self.stack.?.append(num);\n} // \u51fa\u6808\npub fn pop(self: *Self) T {\nvar num = self.stack.?.pop();\nreturn num;\n} // \u8fd4\u56de ArrayList\npub fn toList(self: *Self) std.ArrayList(T) {\nreturn self.stack.?;\n}\n};\n}\n
"},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3. \u00a0 \u4e24\u79cd\u5b9e\u73b0\u5bf9\u6bd4","text":""},{"location":"chapter_stack_and_queue/stack/#_3","title":"\u652f\u6301\u64cd\u4f5c","text":"

\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

"},{"location":"chapter_stack_and_queue/stack/#_4","title":"\u65f6\u95f4\u6548\u7387","text":"

\u5728\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0\u4e2d\uff0c\u5165\u6808\u548c\u51fa\u6808\u64cd\u4f5c\u90fd\u662f\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\u94fe\u8868\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\uff08\u5982 int , double \uff09\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\uff1a

  • \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\uff1b
  • \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\uff1b
"},{"location":"chapter_stack_and_queue/stack/#_5","title":"\u7a7a\u95f4\u6548\u7387","text":"

\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\u8fc7\u5b9e\u9645\u9700\u6c42\u3002\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\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\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\u5c06\u4e0a\u4e00\u4e2a\u7f51\u9875\u6267\u884c\u5165\u6808\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u300c\u540e\u9000\u300d\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u9875\u9762\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\u6267\u884c\u51fa\u6808\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4. \u00a0 \u5c0f\u7ed3","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
  • \u4ece\u65f6\u95f4\u6548\u7387\u89d2\u5ea6\u770b\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\u964d\u4f4e\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\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_tree/array_representation_of_tree/","title":"8.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\u5728\u4e0a\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u5728\u94fe\u8868\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7684\u5404\u9879\u57fa\u672c\u64cd\u4f5c\u3002

\u90a3\u4e48\uff0c\u80fd\u5426\u7528\u300c\u6570\u7ec4\u300d\u6765\u8868\u793a\u4e8c\u53c9\u6811\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#831","title":"8.3.1. \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u5148\u5206\u6790\u4e00\u4e2a\u7b80\u5355\u6848\u4f8b\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u6211\u4eec\u5c06\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u7f16\u53f7\uff08\u4ece \\(0\\) \u5f00\u59cb\uff09\uff0c\u6b64\u65f6\u6bcf\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u552f\u4e00\u7684\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\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

Fig. \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u6620\u5c04\u516c\u5f0f\u7684\u4f5c\u7528\u76f8\u5f53\u4e8e\u94fe\u8868\u4e2d\u7684\u6307\u9488\u3002\u5982\u679c\u6211\u4eec\u5c06\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u5b58\u50a8\u5728\u4e00\u4e2a\u6570\u7ec4\u4e2d\uff0c\u90a3\u4e48\u5bf9\u4e8e\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u8282\u70b9\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u901a\u8fc7\u6620\u5c04\u516c\u5f0f\u6765\u8bbf\u95ee\u5176\u5b50\u8282\u70b9\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#832","title":"8.3.2. \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u53c9\u6811","text":"

\u7136\u800c\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u53ea\u662f\u4e00\u4e2a\u7279\u4f8b\u3002\u5728\u4e8c\u53c9\u6811\u7684\u4e2d\u95f4\u5c42\uff0c\u901a\u5e38\u5b58\u5728\u8bb8\u591a \\(\\text{null}\\) \uff0c\u800c\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5e76\u4e0d\u5305\u542b\u8fd9\u4e9b \\(\\text{null}\\) \u3002\u6211\u4eec\u65e0\u6cd5\u4ec5\u51ed\u8be5\u5e8f\u5217\u6765\u63a8\u6d4b \\(\\text{null}\\) \u7684\u6570\u91cf\u548c\u5206\u5e03\u4f4d\u7f6e\uff0c\u8fd9\u610f\u5473\u7740\u5b58\u5728\u591a\u79cd\u4e8c\u53c9\u6811\u7ed3\u6784\u90fd\u7b26\u5408\u8be5\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002\u663e\u7136\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4e0a\u8ff0\u7684\u6570\u7ec4\u8868\u793a\u65b9\u6cd5\u5df2\u7ecf\u5931\u6548\u3002

Fig. \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 \\(\\text{null}\\)\u3002\u5982\u4e0b\u56fe\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \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 \u6700\u5927\u503c\u6807\u8bb0\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u8282\u70b9\u503c\u4e0d\u80fd\u4e3a INT_MAX\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# \u76f4\u63a5\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 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// \u76f4\u63a5\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// \u76f4\u63a5\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 \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 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 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
\n

Fig. \u4efb\u610f\u7c7b\u578b\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

"},{"location":"chapter_tree/array_representation_of_tree/#833","title":"8.3.3. \u00a0 \u4f18\u52bf\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\u5b58\u5728\u4ee5\u4e0b\u4f18\u70b9\uff1a

  • \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u7f13\u5b58\u53cb\u597d\uff0c\u8bbf\u95ee\u4e0e\u904d\u5386\u901f\u5ea6\u8f83\u5feb\uff1b
  • \u4e0d\u9700\u8981\u5b58\u50a8\u6307\u9488\uff0c\u6bd4\u8f83\u8282\u7701\u7a7a\u95f4\uff1b
  • \u5141\u8bb8\u968f\u673a\u8bbf\u95ee\u8282\u70b9\uff1b

\u7136\u800c\uff0c\u6570\u7ec4\u8868\u793a\u4e5f\u5177\u6709\u4e00\u4e9b\u5c40\u9650\u6027\uff1a

  • \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\uff1b
  • \u5f53\u4e8c\u53c9\u6811\u4e2d\u5b58\u5728\u5927\u91cf \\(\\text{null}\\) \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

\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\uff0c\\(\\text{null}\\) \u53ea\u51fa\u73b0\u5728\u6700\u5e95\u5c42\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u8fd9\u610f\u5473\u7740\u6240\u6709 \\(\\text{null}\\) \u4e00\u5b9a\u51fa\u73b0\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u672b\u5c3e\u3002\u56e0\u6b64\uff0c\u5728\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u5b8c\u5168\u4e8c\u53c9\u6811\u65f6\uff0c\u53ef\u4ee5\u7701\u7565\u5b58\u50a8\u6240\u6709 \\(\\text{null}\\) \u3002

Fig. \u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

"},{"location":"chapter_tree/avl_tree/","title":"8.5. \u00a0 AVL \u6811 *","text":"

\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u4e86\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\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c06\u4ece \\(O(\\log n)\\) \u6076\u5316\u4e3a \\(O(n)\\)\u3002

\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u7ecf\u8fc7\u4e24\u6b21\u5220\u9664\u8282\u70b9\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u4e8c\u53c9\u641c\u7d22\u6811\u4fbf\u4f1a\u9000\u5316\u4e3a\u94fe\u8868\u3002

Fig. AVL \u6811\u5728\u5220\u9664\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

\u518d\u4f8b\u5982\uff0c\u5728\u4ee5\u4e0b\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\u6076\u5316\u3002

Fig. AVL \u6811\u5728\u63d2\u5165\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u5176 1962 \u5e74\u53d1\u8868\u7684\u8bba\u6587 \"An algorithm for the organization of information\" \u4e2d\u63d0\u51fa\u4e86\u300cAVL \u6811\u300d\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/#851-avl","title":"8.5.1. \u00a0 AVL \u6811\u5e38\u89c1\u672f\u8bed","text":"

\u300cAVL \u6811\u300d\u65e2\u662f\u4e8c\u53c9\u641c\u7d22\u6811\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\u4e5f\u88ab\u79f0\u4e3a\u300c\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\u300d\u3002

"},{"location":"chapter_tree/avl_tree/#_1","title":"\u8282\u70b9\u9ad8\u5ea6","text":"

\u5728\u64cd\u4f5c AVL \u6811\u65f6\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u8282\u70b9\u7684\u9ad8\u5ea6\uff0c\u56e0\u6b64\u9700\u8981\u4e3a AVL \u6811\u7684\u8282\u70b9\u7c7b\u6dfb\u52a0 height \u53d8\u91cf\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\npublic int val;        // \u8282\u70b9\u503c\npublic int height;     // \u8282\u70b9\u9ad8\u5ea6\npublic TreeNode left;  // \u5de6\u5b50\u8282\u70b9\npublic TreeNode right; // \u53f3\u5b50\u8282\u70b9\npublic TreeNode(int x) { val = x; }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nstruct TreeNode {\nint val{};          // \u8282\u70b9\u503c\nint height = 0;     // \u8282\u70b9\u9ad8\u5ea6\nTreeNode *left{};   // \u5de6\u5b50\u8282\u70b9\nTreeNode *right{};  // \u53f3\u5b50\u8282\u70b9\nTreeNode() = default;\nexplicit TreeNode(int x) : val(x){}\n};\n
class TreeNode:\n\"\"\"AVL \u6811\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                    # \u8282\u70b9\u503c\nself.height: int = 0                   # \u8282\u70b9\u9ad8\u5ea6\nself.left: Optional[TreeNode] = None   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\nself.right: Optional[TreeNode] = None  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\nVal    int       // \u8282\u70b9\u503c\nHeight int       // \u8282\u70b9\u9ad8\u5ea6\nLeft   *TreeNode // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\nRight  *TreeNode // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nval; // \u8282\u70b9\u503c\nheight; //\u8282\u70b9\u9ad8\u5ea6\nleft; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nright; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nconstructor(val, left, right, height) {\nthis.val = val === undefined ? 0 : val;\nthis.height = height === undefined ? 0 : height;\nthis.left = left === undefined ? null : left;\nthis.right = right === undefined ? null : right;\n}\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nval: number;            // \u8282\u70b9\u503c\nheight: number;         // \u8282\u70b9\u9ad8\u5ea6\nleft: TreeNode | null;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nright: TreeNode | null; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nconstructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\nthis.val = val === undefined ? 0 : val;\nthis.height = height === undefined ? 0 : height; this.left = left === undefined ? null : left; this.right = right === undefined ? null : right; }\n}\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\nint val;\nint height;\nstruct TreeNode *left;\nstruct TreeNode *right;\n};\ntypedef struct TreeNode TreeNode;\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\nTreeNode *node;\nnode = (TreeNode *)malloc(sizeof(TreeNode));\nnode->val = val;\nnode->height = 0;\nnode->left = NULL;\nnode->right = NULL;\nreturn node;\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\npublic int val;          // \u8282\u70b9\u503c\npublic int height;       // \u8282\u70b9\u9ad8\u5ea6\npublic TreeNode? left;   // \u5de6\u5b50\u8282\u70b9\npublic TreeNode? right;  // \u53f3\u5b50\u8282\u70b9\npublic TreeNode(int x) { val = x; }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nvar val: Int // \u8282\u70b9\u503c\nvar height: Int // \u8282\u70b9\u9ad8\u5ea6\nvar left: TreeNode? // \u5de6\u5b50\u8282\u70b9\nvar right: TreeNode? // \u53f3\u5b50\u8282\u70b9\ninit(x: Int) {\nval = x\nheight = 0\n}\n}\n
\n

\u300c\u8282\u70b9\u9ad8\u5ea6\u300d\u662f\u6307\u4ece\u8be5\u8282\u70b9\u5230\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nreturn node == null ? -1 : node.height;\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\nnode.height = Math.max(height(node.left), height(node.right)) + 1;\n}\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\nreturn node == nullptr ? -1 : node->height;\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\nnode->height = max(height(node->left), height(node->right)) + 1;\n}\n
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\nif node is not None:\nreturn node.height\nreturn -1\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\nnode.height = max([self.height(node.left), self.height(node.right)]) + 1\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\nif node != nil {\nreturn node.Height\n}\nreturn -1\n}\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\nlh := t.height(node.Left)\nrh := t.height(node.Right)\n// \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\nif lh > rh {\nnode.Height = lh + 1\n} else {\nnode.Height = rh + 1\n}\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\nreturn node === null ? -1 : node.height;\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\nnode.height =\nMath.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\nreturn node === null ? -1 : node.height;\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\nnode.height =\nMath.max(this.height(node.left), this.height(node.right)) + 1;\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\nif (node != NULL) {\nreturn node->height;\n}\nreturn -1;\n}\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\nint lh = height(node->left);\nint rh = height(node->right);\n// \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\nif (lh > rh) {\nnode->height = lh + 1;\n} else {\nnode->height = rh + 1;\n}\n}\n
avl_tree.cs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node)\n{\n// \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\nreturn node == null ? -1 : node.height;\n}\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node)\n{\n// \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\nnode.height = Math.Max(height(node.left), height(node.right)) + 1;\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\nnode == nil ? -1 : node!.height\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\nnode?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\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\nreturn if (node == null) -1 else node.?.height;\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\nnode.?.height = std.math.max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#_2","title":"\u8282\u70b9\u5e73\u8861\u56e0\u5b50","text":"

\u8282\u70b9\u7684\u300c\u5e73\u8861\u56e0\u5b50 Balance Factor\u300d\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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n// \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\nif (node == null)\nreturn 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node.left) - height(node.right);\n}\n
avl_tree.cpp
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n// \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\nif (node == nullptr)\nreturn 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node->left) - height(node->right);\n}\n
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\nif node is None:\nreturn 0\n# \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn self.height(node.left) - self.height(node.right)\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\nif node == nil {\nreturn 0\n}\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn t.height(node.Left) - t.height(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\nif (node === null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn 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\nif (node === null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn this.height(node.left) - this.height(node.right);\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\nif (node == NULL) {\nreturn 0;\n}\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node->left) - height(node->right);\n}\n
avl_tree.cs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node)\n{\n// \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\nif (node == null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node.left) - 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\nguard let node = node else { return 0 }\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn height(node: node.left) - height(node: node.right)\n}\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\nif (node == null) return 0;\n// \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\nreturn self.height(node.?.left) - self.height(node.?.right);\n}\n

Note

\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/#852-avl","title":"8.5.2. \u00a0 AVL \u6811\u65cb\u8f6c","text":"

AVL \u6811\u7684\u7279\u70b9\u5728\u4e8e\u300c\u65cb\u8f6c Rotation\u300d\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\u6811\u7684\u300c\u4e8c\u53c9\u641c\u7d22\u6811\u300d\u5c5e\u6027\uff0c\u4e5f\u80fd\u4f7f\u6811\u91cd\u65b0\u53d8\u4e3a\u300c\u5e73\u8861\u4e8c\u53c9\u6811\u300d\u3002

\u6211\u4eec\u5c06\u5e73\u8861\u56e0\u5b50\u7edd\u5bf9\u503c \\(> 1\\) \u7684\u8282\u70b9\u79f0\u4e3a\u300c\u5931\u8861\u8282\u70b9\u300d\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\u6211\u4eec\u5c06\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u65cb\u8f6c\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/avl_tree/#_3","title":"\u53f3\u65cb","text":"

\u5982\u4e0b\u56fe\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\u300c\u53f3\u65cb\u300d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u540e\uff0c\u5b50\u6811\u5df2\u7ecf\u6062\u590d\u5e73\u8861\uff0c\u5e76\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u7279\u6027\u3002

<1><2><3><4>

\u6b64\u5916\uff0c\u5982\u679c\u8282\u70b9 child \u672c\u8eab\u6709\u53f3\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grandChild \uff09\uff0c\u5219\u9700\u8981\u5728\u300c\u53f3\u65cb\u300d\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grandChild \u4f5c\u4e3a node \u7684\u5de6\u5b50\u8282\u70b9\u3002

Fig. \u6709 grandChild \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\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\nTreeNode child = node.left;\nTreeNode grandChild = child.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\nTreeNode *child = node->left;\nTreeNode *grandChild = child->right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild->right = node;\nnode->left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.py
def __right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n\"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\nchild = node.left\ngrand_child = child.right\n# \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node\nnode.left = grand_child\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\nself.__update_height(child)\n# \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\nchild := node.Left\ngrandChild := child.Right\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.Right = node\nnode.Left = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\nt.updateHeight(child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\nconst child = node.left;\nconst grandChild = child.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.#updateHeight(node);\nthis.#updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\nconst child = node.left;\nconst grandChild = child.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.updateHeight(node);\nthis.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\nTreeNode *child, *grandChild;\nchild = node->left;\ngrandChild = child->right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild->right = node;\nnode->left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node)\n{\nTreeNode? child = node.left;\nTreeNode? grandChild = child?.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.right = node;\nnode.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\nlet child = node?.left\nlet grandChild = child?.right\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild?.right = node\nnode?.left = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node: node)\nupdateHeight(node: child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\nvar child = node.?.left;\nvar grandChild = child.?.right;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\nchild.?.right = node;\nnode.?.left = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.updateHeight(node);\nself.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
"},{"location":"chapter_tree/avl_tree/#_4","title":"\u5de6\u65cb","text":"

\u76f8\u5e94\u7684\uff0c\u5982\u679c\u8003\u8651\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u201c\u955c\u50cf\u201d\uff0c\u5219\u9700\u8981\u6267\u884c\u300c\u5de6\u65cb\u300d\u64cd\u4f5c\u3002

Fig. \u5de6\u65cb\u64cd\u4f5c

\u540c\u7406\uff0c\u82e5\u8282\u70b9 child \u672c\u8eab\u6709\u5de6\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grandChild \uff09\uff0c\u5219\u9700\u8981\u5728\u300c\u5de6\u65cb\u300d\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grandChild \u4f5c\u4e3a node \u7684\u53f3\u5b50\u8282\u70b9\u3002

Fig. \u6709 grandChild \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\u53ef\u4ee5\u8f7b\u677e\u5730\u4ece\u53f3\u65cb\u7684\u4ee3\u7801\u63a8\u5bfc\u51fa\u5de6\u65cb\u7684\u4ee3\u7801\u3002\u5177\u4f53\u5730\uff0c\u53ea\u9700\u5c06\u300c\u53f3\u65cb\u300d\u4ee3\u7801\u4e2d\u7684\u628a\u6240\u6709\u7684 left \u66ff\u6362\u4e3a right \uff0c\u5c06\u6240\u6709\u7684 right \u66ff\u6362\u4e3a left \uff0c\u5373\u53ef\u5f97\u5230\u300c\u5de6\u65cb\u300d\u4ee3\u7801\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\nTreeNode child = node.right;\nTreeNode grandChild = child.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\nTreeNode *child = node->right;\nTreeNode *grandChild = child->left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild->left = node;\nnode->right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.py
def __left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n\"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\nchild = node.right\ngrand_child = child.left\n# \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node\nnode.right = grand_child\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\nself.__update_height(child)\n# \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\nchild := node.Right\ngrandChild := child.Left\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.Left = node\nnode.Right = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\nt.updateHeight(child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\nconst child = node.right;\nconst grandChild = child.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.#updateHeight(node);\nthis.#updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\nconst child = node.right;\nconst grandChild = child.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nthis.updateHeight(node);\nthis.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\nTreeNode *child, *grandChild;\nchild = node->right;\ngrandChild = child->left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild->left = node;\nnode->right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node)\n{\nTreeNode? child = node.right;\nTreeNode? grandChild = child?.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.left = node;\nnode.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\nupdateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\nlet child = node?.right\nlet grandChild = child?.left\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild?.left = node\nnode?.right = grandChild\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node: node)\nupdateHeight(node: child)\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child\n}\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\nvar child = node.?.right;\nvar grandChild = child.?.left;\n// \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\nchild.?.left = node;\nnode.?.right = grandChild;\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.updateHeight(node);\nself.updateHeight(child);\n// \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn child;\n}\n
"},{"location":"chapter_tree/avl_tree/#_5","title":"\u5148\u5de6\u65cb\u540e\u53f3\u65cb","text":"

\u5bf9\u4e8e\u4e0b\u56fe\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\u5de6\u65cb\u540e\u53f3\u65cb\uff0c\u5373\u5148\u5bf9 child \u6267\u884c\u300c\u5de6\u65cb\u300d\uff0c\u518d\u5bf9 node \u6267\u884c\u300c\u53f3\u65cb\u300d\u3002

Fig. \u5148\u5de6\u65cb\u540e\u53f3\u65cb

"},{"location":"chapter_tree/avl_tree/#_6","title":"\u5148\u53f3\u65cb\u540e\u5de6\u65cb","text":"

\u540c\u7406\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u955c\u50cf\u60c5\u51b5\uff0c\u9700\u8981\u5148\u53f3\u65cb\u540e\u5de6\u65cb\uff0c\u5373\u5148\u5bf9 child \u6267\u884c\u300c\u53f3\u65cb\u300d\uff0c\u7136\u540e\u5bf9 node \u6267\u884c\u300c\u5de6\u65cb\u300d\u3002

Fig. \u5148\u53f3\u65cb\u540e\u5de6\u65cb

"},{"location":"chapter_tree/avl_tree/#_7","title":"\u65cb\u8f6c\u7684\u9009\u62e9","text":"

\u4e0b\u56fe\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\u5de6\u65cb\u3001\u5148\u53f3\u540e\u5de6\u3001\u5148\u5de6\u540e\u53f3\u7684\u65cb\u8f6c\u64cd\u4f5c\u3002

Fig. AVL \u6811\u7684\u56db\u79cd\u65cb\u8f6c\u60c5\u51b5

\u5728\u4ee3\u7801\u4e2d\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\u4e0a\u56fe\u4e2d\u7684\u54ea\u79cd\u60c5\u51b5\u3002

\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 \\(>0\\) \uff08\u5373\u5de6\u504f\u6811\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(>0\\) \uff08\u5373\u5de6\u504f\u6811\uff09 \\(<0\\) \u5148\u5de6\u65cb\u540e\u53f3\u65cb \\(<0\\) \uff08\u5373\u53f3\u504f\u6811\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(<0\\) \uff08\u5373\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nint balanceFactor = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactor > 1) {\nif (balanceFactor(node.left) >= 0) {\n// \u53f3\u65cb\nreturn rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = leftRotate(node.left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactor < -1) {\nif (balanceFactor(node.right) <= 0) {\n// \u5de6\u65cb\nreturn leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = rightRotate(node.right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\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\nint _balanceFactor = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (_balanceFactor > 1) {\nif (balanceFactor(node->left) >= 0) {\n// \u53f3\u65cb\nreturn rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode->left = leftRotate(node->left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (_balanceFactor < -1) {\nif (balanceFactor(node->right) <= 0) {\n// \u5de6\u65cb\nreturn leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode->right = rightRotate(node->right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\n
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\nbalance_factor = self.balance_factor(node)\n# \u5de6\u504f\u6811\nif balance_factor > 1:\nif self.balance_factor(node.left) >= 0:\n# \u53f3\u65cb\nreturn self.__right_rotate(node)\nelse:\n# \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = self.__left_rotate(node.left)\nreturn self.__right_rotate(node)\n# \u53f3\u504f\u6811\nelif balance_factor < -1:\nif self.balance_factor(node.right) <= 0:\n# \u5de6\u65cb\nreturn self.__left_rotate(node)\nelse:\n# \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = self.__right_rotate(node.right)\nreturn self.__left_rotate(node)\n# \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\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\nbf := t.balanceFactor(node)\n// \u5de6\u504f\u6811\nif bf > 1 {\nif t.balanceFactor(node.Left) >= 0 {\n// \u53f3\u65cb\nreturn t.rightRotate(node)\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.Left = t.leftRotate(node.Left)\nreturn t.rightRotate(node)\n}\n}\n// \u53f3\u504f\u6811\nif bf < -1 {\nif t.balanceFactor(node.Right) <= 0 {\n// \u5de6\u65cb\nreturn t.leftRotate(node)\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.Right = t.rightRotate(node.Right)\nreturn t.leftRotate(node)\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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\nconst balanceFactor = this.balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactor > 1) {\nif (this.balanceFactor(node.left) >= 0) {\n// \u53f3\u65cb\nreturn this.#rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = this.#leftRotate(node.left);\nreturn this.#rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactor < -1) {\nif (this.balanceFactor(node.right) <= 0) {\n// \u5de6\u65cb\nreturn this.#leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = this.#rightRotate(node.right);\nreturn this.#leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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\nconst balanceFactor = this.balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactor > 1) {\nif (this.balanceFactor(node.left) >= 0) {\n// \u53f3\u65cb\nreturn this.rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = this.leftRotate(node.left);\nreturn this.rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactor < -1) {\nif (this.balanceFactor(node.right) <= 0) {\n// \u5de6\u65cb\nreturn this.leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = this.rightRotate(node.right);\nreturn this.leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\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\nint bf = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (bf > 1) {\nif (balanceFactor(node->left) >= 0) {\n// \u53f3\u65cb\nreturn rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode->left = leftRotate(node->left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (bf < -1) {\nif (balanceFactor(node->right) <= 0) {\n// \u5de6\u65cb\nreturn leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode->right = rightRotate(node->right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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{\n// \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\nint balanceFactorInt = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactorInt > 1)\n{\nif (balanceFactor(node.left) >= 0)\n{\n// \u53f3\u65cb\nreturn rightRotate(node);\n}\nelse\n{\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.left = leftRotate(node?.left);\nreturn rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balanceFactorInt < -1)\n{\nif (balanceFactor(node.right) <= 0)\n{\n// \u5de6\u65cb\nreturn leftRotate(node);\n}\nelse\n{\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.right = rightRotate(node?.right);\nreturn leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn 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\nlet balanceFactor = balanceFactor(node: node)\n// \u5de6\u504f\u6811\nif balanceFactor > 1 {\nif self.balanceFactor(node: node?.left) >= 0 {\n// \u53f3\u65cb\nreturn rightRotate(node: node)\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode?.left = leftRotate(node: node?.left)\nreturn rightRotate(node: node)\n}\n}\n// \u53f3\u504f\u6811\nif balanceFactor < -1 {\nif self.balanceFactor(node: node?.right) <= 0 {\n// \u5de6\u65cb\nreturn leftRotate(node: node)\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode?.right = rightRotate(node: node?.right)\nreturn leftRotate(node: node)\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\n}\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\nvar balance_factor = self.balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balance_factor > 1) {\nif (self.balanceFactor(node.?.left) >= 0) {\n// \u53f3\u65cb\nreturn self.rightRotate(node);\n} else {\n// \u5148\u5de6\u65cb\u540e\u53f3\u65cb\nnode.?.left = self.leftRotate(node.?.left);\nreturn self.rightRotate(node);\n}\n}\n// \u53f3\u504f\u6811\nif (balance_factor < -1) {\nif (self.balanceFactor(node.?.right) <= 0) {\n// \u5de6\u65cb\nreturn self.leftRotate(node);\n} else {\n// \u5148\u53f3\u65cb\u540e\u5de6\u65cb\nnode.?.right = self.rightRotate(node.?.right);\nreturn self.leftRotate(node);\n}\n}\n// \u5e73\u8861\u6811\uff0c\u65e0\u9700\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\n
"},{"location":"chapter_tree/avl_tree/#853-avl","title":"8.5.3. \u00a0 AVL \u6811\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#_8","title":"\u63d2\u5165\u8282\u70b9","text":"

\u300cAVL \u6811\u300d\u7684\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u4e0e\u300c\u4e8c\u53c9\u641c\u7d22\u6811\u300d\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\nroot = insertHelper(root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\nif (node == null)\nreturn new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val)\nnode.left = insertHelper(node.left, val);\nelse if (val > node.val)\nnode.right = insertHelper(node.right, val);\nelse\nreturn node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\nroot = insertHelper(root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\nif (node == nullptr)\nreturn new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node->val)\nnode->left = insertHelper(node->left, val);\nelse if (val > node->val)\nnode->right = insertHelper(node->right, val);\nelse\nreturn node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.py
def insert(self, val) -> None:\n\"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\nself.__root = self.__insert_helper(self.__root, val)\ndef __insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n\"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\nif node is None:\nreturn TreeNode(val)\n# 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9\nif val < node.val:\nnode.left = self.__insert_helper(node.left, val)\nelif val > node.val:\nnode.right = self.__insert_helper(node.right, val)\nelse:\n# \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\n# 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nreturn self.__rotate(node)\n
avl_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\nt.root = t.insertHelper(t.root, val)\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\nif node == nil {\nreturn NewTreeNode(val)\n}\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif val < node.Val {\nnode.Left = t.insertHelper(node.Left, val)\n} else if val > node.Val {\nnode.Right = t.insertHelper(node.Right, val)\n} else {\n// \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = t.rotate(node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\nthis.root = this.#insertHelper(this.root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\nif (node === null) return new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val) node.left = this.#insertHelper(node.left, val);\nelse if (val > node.val)\nnode.right = this.#insertHelper(node.right, val);\nelse return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nthis.#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 */\nnode = this.#rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\nthis.root = this.insertHelper(this.root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\nif (node === null) return new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val) {\nnode.left = this.insertHelper(node.left, val);\n} else if (val > node.val) {\nnode.right = this.insertHelper(node.right, val);\n} else {\nreturn node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n}\nthis.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 */\nnode = this.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(aVLTree *tree, int val) {\ntree->root = insertHelper(tree->root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\nif (node == NULL) {\nreturn newTreeNode(val);\n}\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node->val) {\nnode->left = insertHelper(node->left, val);\n} else if (val > node->val) {\nnode->right = insertHelper(node->right, val);\n} else {\n// \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nreturn node;\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val)\n{\nroot = insertHelper(root, val);\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val)\n{\nif (node == null) return new TreeNode(val);\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif (val < node.val)\nnode.left = insertHelper(node.left, val);\nelse if (val > node.val)\nnode.right = insertHelper(node.right, val);\nelse\nreturn node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\n@discardableResult\nfunc insert(val: Int) {\nroot = insertHelper(node: root, val: val)\n}\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\nvar node = node\nif node == nil {\nreturn TreeNode(x: val)\n}\n/* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9 */\nif val < node!.val {\nnode?.left = insertHelper(node: node?.left, val: val)\n} else if val > node!.val {\nnode?.right = insertHelper(node: node?.right, val: val)\n} else {\nreturn node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n}\nupdateHeight(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 */\nnode = rotate(node: node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) void {\nself.root = try self.insertHelper(self.root, val);\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) {\nvar node = node_;\nif (node == null) {\nvar tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\ntmp_node.init(val);\nreturn tmp_node;\n}\n// 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff0c\u5e76\u63d2\u5165\u8282\u70b9\nif (val < node.?.val) {\nnode.?.left = try self.insertHelper(node.?.left, val);\n} else if (val > node.?.val) {\nnode.?.right = try self.insertHelper(node.?.right, val);\n} else {\nreturn node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n}\nself.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\nnode = self.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
"},{"location":"chapter_tree/avl_tree/#_9","title":"\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\u5730\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig avl_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\nroot = removeHelper(root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\nif (node == null)\nreturn null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val)\nnode.left = removeHelper(node.left, val);\nelse if (val > node.val)\nnode.right = removeHelper(node.right, val);\nelse {\nif (node.left == null || node.right == null) {\nTreeNode child = node.left != null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == null)\nreturn null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse\nnode = 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\nTreeNode temp = node.right;\nwhile (temp.left != null) {\ntemp = temp.left;\n}\nnode.right = removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\nroot = removeHelper(root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\nif (node == nullptr)\nreturn nullptr;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node->val)\nnode->left = removeHelper(node->left, val);\nelse if (val > node->val)\nnode->right = removeHelper(node->right, val);\nelse {\nif (node->left == nullptr || node->right == nullptr) {\nTreeNode *child = node->left != nullptr ? node->left : node->right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == nullptr) {\ndelete node;\nreturn nullptr;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse {\ndelete node;\nnode = 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\nTreeNode *temp = node->right;\nwhile (temp->left != nullptr) {\ntemp = temp->left;\n}\nint tempVal = temp->val;\nnode->right = removeHelper(node->right, temp->val);\nnode->val = tempVal;\n}\n}\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.py
def remove(self, val: int) -> None:\n\"\"\"\u5220\u9664\u8282\u70b9\"\"\"\nself.__root = self.__remove_helper(self.__root, val)\ndef __remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n\"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\nif node is None:\nreturn None\n# 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b\nif val < node.val:\nnode.left = self.__remove_helper(node.left, val)\nelif val > node.val:\nnode.right = self.__remove_helper(node.right, val)\nelse:\nif node.left is None or node.right is None:\nchild = node.left or node.right\n# \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif child is None:\nreturn None\n# \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse:\nnode = child\nelse:\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\ntemp = node.right\nwhile temp.left is not None:\ntemp = temp.left\nnode.right = self.__remove_helper(node.right, temp.val)\nnode.val = temp.val\n# \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nself.__update_height(node)\n# 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nreturn self.__rotate(node)\n
avl_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\nt.root = t.removeHelper(t.root, val)\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\nif node == nil {\nreturn nil\n}\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif val < node.Val {\nnode.Left = t.removeHelper(node.Left, val)\n} else if val > node.Val {\nnode.Right = t.removeHelper(node.Right, val)\n} else {\nif node.Left == nil || node.Right == nil {\nchild := node.Left\nif node.Right != nil {\nchild = node.Right\n}\nif child == nil {\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nreturn nil\n} else {\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nnode = 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\ntemp := node.Right\nfor temp.Left != nil {\ntemp = temp.Left\n}\nnode.Right = t.removeHelper(node.Right, temp.Val)\nnode.Val = temp.Val\n}\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nt.updateHeight(node)\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = t.rotate(node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(val) {\nthis.root = this.#removeHelper(this.root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\nif (node === null) return null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val) node.left = this.#removeHelper(node.left, val);\nelse if (val > node.val)\nnode.right = this.#removeHelper(node.right, val);\nelse {\nif (node.left === null || node.right === null) {\nconst child = node.left !== null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child === null) return null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse 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\nlet temp = node.right;\nwhile (temp.left !== null) {\ntemp = temp.left;\n}\nnode.right = this.#removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nthis.#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 */\nnode = this.#rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\nthis.root = this.removeHelper(this.root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\nif (node === null) return null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val) {\nnode.left = this.removeHelper(node.left, val);\n} else if (val > node.val) {\nnode.right = this.removeHelper(node.right, val);\n} else {\nif (node.left === null || node.right === null) {\nconst child = node.left !== null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child === null) {\nreturn null;\n} else {\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nnode = 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\nlet temp = node.right;\nwhile (temp.left !== null) {\ntemp = temp.left;\n}\nnode.right = this.removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nthis.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 */\nnode = this.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\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 removeNode(aVLTree *tree, int val) {\nTreeNode *root = removeHelper(tree->root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\nTreeNode *child, *grandChild;\nif (node == NULL) {\nreturn NULL;\n}\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node->val) {\nnode->left = removeHelper(node->left, val);\n} else if (val > node->val) {\nnode->right = removeHelper(node->right, val);\n} else {\nif (node->left == NULL || node->right == NULL) {\nchild = node->left;\nif (node->right != NULL) {\nchild = node->right;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == NULL) {\nreturn NULL;\n} else {\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nnode = 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\nTreeNode *temp = node->right;\nwhile (temp->left != NULL) {\ntemp = temp->left;\n}\nint tempVal = temp->val;\nnode->right = removeHelper(node->right, temp->val);\nnode->val = tempVal;\n}\n}\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nupdateHeight(node);\n/* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val)\n{\nroot = removeHelper(root, val);\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val)\n{\nif (node == null) return null;\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif (val < node.val)\nnode.left = removeHelper(node.left, val);\nelse if (val > node.val)\nnode.right = removeHelper(node.right, val);\nelse\n{\nif (node.left == null || node.right == null)\n{\nTreeNode? child = node.left != null ? node.left : node.right;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif (child == null)\nreturn null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse\nnode = child;\n}\nelse\n{\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\nTreeNode? temp = node.right;\nwhile (temp.left != null)\n{\ntemp = temp.left;\n}\nnode.right = removeHelper(node.right, temp.val);\nnode.val = temp.val;\n}\n}\nupdateHeight(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 */\nnode = rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
avl_tree.swift
/* \u5220\u9664\u8282\u70b9 */\n@discardableResult\nfunc remove(val: Int) {\nroot = removeHelper(node: root, val: val)\n}\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\nvar node = node\nif node == nil {\nreturn nil\n}\n/* 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b */\nif val < node!.val {\nnode?.left = removeHelper(node: node?.left, val: val)\n} else if val > node!.val {\nnode?.right = removeHelper(node: node?.right, val: val)\n} else {\nif node?.left == nil || node?.right == nil {\nlet child = node?.left != nil ? node?.left : node?.right\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\nif child == nil {\nreturn nil\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\nelse {\nnode = 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\nlet temp = node?.right\nwhile temp?.left != nil {\ntemp = temp?.left\n}\nnode?.right = removeHelper(node: node?.right, val: temp!.val)\nnode?.val = temp!.val\n}\n}\nupdateHeight(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 */\nnode = rotate(node: node)\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node\n}\n
avl_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\nself.root = self.removeHelper(self.root, val);\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) {\nvar node = node_;\nif (node == null) return null;\n// 1. \u67e5\u627e\u8282\u70b9\uff0c\u5e76\u5220\u9664\u4e4b\nif (val < node.?.val) {\nnode.?.left = self.removeHelper(node.?.left, val);\n} else if (val > node.?.val) {\nnode.?.right = self.removeHelper(node.?.right, val);\n} else {\nif (node.?.left == null or node.?.right == null) {\nvar 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\nif (child == null) {\nreturn null;\n// \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n} else {\nnode = 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\nvar temp = node.?.right;\nwhile (temp.?.left != null) {\ntemp = temp.?.left;\n}\nnode.?.right = self.removeHelper(node.?.right, temp.?.val);\nnode.?.val = temp.?.val;\n}\n}\nself.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\nnode = self.rotate(node);\n// \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\nreturn node;\n}\n
"},{"location":"chapter_tree/avl_tree/#_10","title":"\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/#854-avl","title":"8.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\uff1b
  • \u7528\u4e8e\u6784\u5efa\u6570\u636e\u5e93\u4e2d\u7684\u7d22\u5f15\u7cfb\u7edf\uff1b

\u4e3a\u4ec0\u4e48\u7ea2\u9ed1\u6811\u6bd4 AVL \u6811\u66f4\u53d7\u6b22\u8fce\uff1f

\u7ea2\u9ed1\u6811\u7684\u5e73\u8861\u6761\u4ef6\u76f8\u5bf9\u5bbd\u677e\uff0c\u56e0\u6b64\u5728\u7ea2\u9ed1\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u6240\u9700\u7684\u65cb\u8f6c\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\u5728\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u4e0a\u7684\u5e73\u5747\u6548\u7387\u9ad8\u4e8e AVL \u6811\u3002

"},{"location":"chapter_tree/binary_search_tree/","title":"8.4. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811","text":"

\u300c\u4e8c\u53c9\u641c\u7d22\u6811 Binary Search Tree\u300d\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\uff1a

  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\uff1b
  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. \uff1b

Fig. \u4e8c\u53c9\u641c\u7d22\u6811

"},{"location":"chapter_tree/binary_search_tree/#841","title":"8.4.1. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_search_tree/#_1","title":"\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\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

  • \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 \uff1b
  • \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 \uff1b
  • \u82e5 cur.val = num \uff0c\u8bf4\u660e\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\u5e76\u8fd4\u56de\u8be5\u8282\u70b9\uff1b
<1><2><3><4>

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_tree.java
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\nTreeNode cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num)\ncur = cur.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur.val > num)\ncur = cur.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse\nbreak;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.cpp
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\nTreeNode *cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != nullptr) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur->val < num)\ncur = cur->right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur->val > num)\ncur = cur->left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse\nbreak;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n\"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\ncur: TreeNode | None = self.__root\n# \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur is not None:\n# \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur.val < num:\ncur = cur.right\n# \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelif cur.val > num:\ncur = cur.left\n# \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse:\nbreak\nreturn cur\n
binary_search_tree.go
/* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\nnode := bst.root\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nfor node != nil {\nif node.Val < num {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nnode = node.Right\n} else if node.Val > num {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nnode = node.Left\n} else {\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nbreak\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn node\n}\n
binary_search_tree.js
/* \u67e5\u627e\u8282\u70b9 */\nfunction search(num) {\nlet cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur.val > num) cur = cur.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse break;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.ts
/* \u67e5\u627e\u8282\u70b9 */\nfunction search(num: number): TreeNode | null {\nlet cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\nif (cur.val < num) {\ncur = cur.right; // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n} else if (cur.val > num) {\ncur = cur.left; // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else {\nbreak; // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.c
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(binarySearchTree *bst, int num) {\nTreeNode *cur = bst->root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != NULL) {\nif (cur->val < num) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\ncur = cur->right;\n} else if (cur->val > num) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\ncur = cur->left;\n} else {\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nbreak;\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.cs
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int num)\n{\nTreeNode? cur = root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null)\n{\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if (cur.val > num) cur = cur.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse break;\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
binary_search_tree.swift
/* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\nvar cur = root\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur != nil {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur!.val < num {\ncur = cur?.right\n}\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse if cur!.val > num {\ncur = cur?.left\n}\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nelse {\nbreak\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur\n}\n
binary_search_tree.zig
// \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\nvar cur = self.root;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.?.val < num) {\ncur = cur.?.right;\n// \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else if (cur.?.val > num) {\ncur = cur.?.left;\n// \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n} else {\nbreak;\n}\n}\n// \u8fd4\u56de\u76ee\u6807\u8282\u70b9\nreturn cur;\n}\n
"},{"location":"chapter_tree/binary_search_tree/#_2","title":"\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\u5206\u4e3a\u4e24\u6b65\uff1a

  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 \\(\\text{null}\\) \uff09\u65f6\u8df3\u51fa\u5faa\u73af\uff1b
  2. \u5728\u8be5\u4f4d\u7f6e\u63d2\u5165\u8282\u70b9\uff1a\u521d\u59cb\u5316\u8282\u70b9 num \uff0c\u5c06\u8be5\u8282\u70b9\u7f6e\u4e8e \\(\\text{null}\\) \u7684\u4f4d\u7f6e\uff1b

\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

Fig. \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u63d2\u5165\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null)\nreturn;\nTreeNode cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.val == num)\nreturn;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num)\ncur = cur.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur.left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode node = new TreeNode(num);\nif (pre.val < num)\npre.right = node;\nelse\npre.left = node;\n}\n
binary_search_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == nullptr)\nreturn;\nTreeNode *cur = root, *pre = nullptr;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != nullptr) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur->val == num)\nreturn;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur->val < num)\ncur = cur->right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur->left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode *node = new TreeNode(num);\nif (pre->val < num)\npre->right = node;\nelse\npre->left = node;\n}\n
binary_search_tree.py
def insert(self, num: int) -> None:\n\"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n# \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif self.__root is None:\nreturn\n# \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\ncur, pre = self.__root, None\nwhile cur is not None:\n# \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif cur.val == num:\nreturn\npre = cur\n# \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur.val < num:\ncur = cur.right\n# \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse:\ncur = cur.left\n# \u63d2\u5165\u8282\u70b9 val\nnode = TreeNode(num)\nif pre.val < num:\npre.right = node\nelse:\npre.left = node\n
binary_search_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\ncur := bst.root\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\nvar pre *TreeNode = nil\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nfor cur != nil {\nif cur.Val == num {\nreturn\n}\npre = cur\nif cur.Val < num {\ncur = cur.Right\n} else {\ncur = cur.Left\n}\n}\n// \u63d2\u5165\u8282\u70b9\nnode := NewTreeNode(num)\nif pre.Val < num {\npre.Right = node\n} else {\npre.Left = node\n}\n}\n
binary_search_tree.js
/* \u63d2\u5165\u8282\u70b9 */\nfunction insert(num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) return;\nlet cur = root,\npre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.val === num) return;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nlet node = new TreeNode(num);\nif (pre.val < num) pre.right = node;\nelse pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\nfunction insert(num: number): void {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) {\nreturn;\n}\nlet cur = root,\npre: TreeNode | null = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\nif (cur.val === num) {\nreturn; // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n}\npre = cur;\nif (cur.val < num) {\ncur = cur.right as TreeNode; // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n} else {\ncur = cur.left as TreeNode; // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nlet node = new TreeNode(num);\nif (pre!.val < num) {\npre!.right = node;\n} else {\npre!.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\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (bst->root == NULL)\nreturn;\nTreeNode *cur = bst->root, *pre = NULL;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != NULL) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur->val == num) {\nreturn;\n}\npre = cur;\nif (cur->val < num) {\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\ncur = cur->right;\n} else {\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\ncur = cur->left;\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode *node = newTreeNode(num);\nif (pre->val < num) {\npre->right = node;\n} else {\npre->left = node;\n}\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num)\n{\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null) return;\nTreeNode? cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null)\n{\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.val == num) return;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u63d2\u5165\u8282\u70b9 val\nTreeNode node = new TreeNode(num);\nif (pre != null)\n{\nif (pre.val < num) pre.right = node;\nelse pre.left = node;\n}\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif root == nil {\nreturn\n}\nvar cur = root\nvar pre: TreeNode?\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur != nil {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif cur!.val == num {\nreturn\n}\npre = cur\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur!.val < num {\ncur = cur?.right\n}\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse {\ncur = cur?.left\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nlet node = TreeNode(x: num)\nif pre!.val < num {\npre?.right = node\n} else {\npre?.left = node\n}\n}\n
binary_search_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (self.root == null) return;\nvar cur = self.root;\nvar pre: ?*inc.TreeNode(T) = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\nif (cur.?.val == num) return;\npre = cur;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.?.val < num) {\ncur = cur.?.right;\n// \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else {\ncur = cur.?.left;\n}\n}\n// \u63d2\u5165\u8282\u70b9 val\nvar node = try self.mem_allocator.create(inc.TreeNode(T));\nnode.init(num);\nif (pre.?.val < num) {\npre.?.right = node;\n} else {\npre.?.left = node;\n}\n}\n

\u4e3a\u4e86\u63d2\u5165\u8282\u70b9\uff0c\u6211\u4eec\u9700\u8981\u5229\u7528\u8f85\u52a9\u8282\u70b9 pre \u4fdd\u5b58\u4e0a\u4e00\u8f6e\u5faa\u73af\u7684\u8282\u70b9\uff0c\u8fd9\u6837\u5728\u904d\u5386\u81f3 \\(\\text{null}\\) \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

\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":"\u5220\u9664\u8282\u70b9","text":"

\u4e0e\u63d2\u5165\u8282\u70b9\u7c7b\u4f3c\uff0c\u6211\u4eec\u9700\u8981\u5728\u5220\u9664\u64cd\u4f5c\u540e\u7ef4\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\u3002\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5728\u4e8c\u53c9\u6811\u4e2d\u6267\u884c\u67e5\u627e\u64cd\u4f5c\uff0c\u83b7\u53d6\u5f85\u5220\u9664\u8282\u70b9\u3002\u63a5\u4e0b\u6765\uff0c\u6839\u636e\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf\uff0c\u5220\u9664\u64cd\u4f5c\u9700\u5206\u4e3a\u4e09\u79cd\u60c5\u51b5\uff1a

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf \\(= 0\\) \u65f6\uff0c\u8868\u793a\u5f85\u5220\u9664\u8282\u70b9\u662f\u53f6\u8282\u70b9\uff0c\u53ef\u4ee5\u76f4\u63a5\u5220\u9664\u3002

Fig. \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 0\uff09

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf \\(= 1\\) \u65f6\uff0c\u5c06\u5f85\u5220\u9664\u8282\u70b9\u66ff\u6362\u4e3a\u5176\u5b50\u8282\u70b9\u5373\u53ef\u3002

Fig. \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 1\uff09

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf \\(= 2\\) \u65f6\uff0c\u5220\u9664\u64cd\u4f5c\u5206\u4e3a\u4e09\u6b65\uff1a

  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 \uff1b
  2. \u5728\u6811\u4e2d\u9012\u5f52\u5220\u9664\u8282\u70b9 tmp \uff1b
  3. \u7528 tmp \u7684\u503c\u8986\u76d6\u5f85\u5220\u9664\u8282\u70b9\u7684\u503c\uff1b
<1><2><3><4>

\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null)\nreturn;\nTreeNode cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val == num)\nbreak;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num)\ncur = cur.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur.left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == null)\nreturn;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left == null || cur.right == null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nTreeNode child = cur.left != null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.left == cur)\npre.left = child;\nelse\npre.right = child;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nTreeNode tmp = cur.right;\nwhile (tmp.left != null) {\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\n}\n}\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\nif (root == nullptr)\nreturn;\nTreeNode *cur = root, *pre = nullptr;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != nullptr) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur->val == num)\nbreak;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur->val < num)\ncur = cur->right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse\ncur = cur->left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == nullptr)\nreturn;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur->left == nullptr || cur->right == nullptr) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\nTreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre->left == cur)\npre->left = child;\nelse\npre->right = child;\n// \u91ca\u653e\u5185\u5b58\ndelete cur;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nTreeNode *tmp = cur->right;\nwhile (tmp->left != nullptr) {\ntmp = tmp->left;\n}\nint tmpVal = tmp->val;\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp->val);\n// \u7528 tmp \u8986\u76d6 cur\ncur->val = tmpVal;\n}\n}\n
binary_search_tree.py
def remove(self, num: int) -> None:\n\"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n# \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif self.__root is None:\nreturn\n# \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\ncur, pre = self.__root, None\nwhile cur is not None:\n# \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif cur.val == num:\nbreak\npre = cur\n# \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur.val < num:\ncur = cur.right\n# \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse:\ncur = cur.left\n# \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif cur is None:\nreturn\n# \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif 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\nchild = cur.left or cur.right\n# \u5220\u9664\u8282\u70b9 cur\nif pre.left == cur:\npre.left = child\nelse:\npre.right = child\n# \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse:\n# \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\ntmp: TreeNode = cur.right\nwhile tmp.left is not None:\ntmp = tmp.left\n# \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nself.remove(tmp.val)\n# \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val\n
binary_search_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\ncur := bst.root\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\nvar pre *TreeNode = nil\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nfor cur != nil {\nif cur.Val == num {\nbreak\n}\npre = cur\nif cur.Val < num {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\ncur = cur.Right\n} else {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\ncur = cur.Left\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\nif cur.Left == nil || cur.Right == nil {\nvar child *TreeNode = nil\n// \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\nif cur.Left != nil {\nchild = cur.Left\n} else {\nchild = cur.Right\n}\n// \u5c06\u5b50\u8282\u70b9\u66ff\u6362\u4e3a\u5f85\u5220\u9664\u8282\u70b9\nif pre.Left == cur {\npre.Left = child\n} else {\npre.Right = 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\ntmp := cur.Right\nfor tmp.Left != nil {\ntmp = tmp.Left\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nbst.remove(tmp.Val)\n// \u7528 tmp \u8986\u76d6 cur\ncur.Val = tmp.Val\n}\n}\n
binary_search_tree.js
/* \u5220\u9664\u8282\u70b9 */\nfunction remove(num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) return;\nlet cur = root,\npre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val === num) break;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur === null) return;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left === null || cur.right === null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nlet child = cur.left !== null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.left === cur) pre.left = child;\nelse pre.right = child;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nlet tmp = cur.right;\nwhile (tmp.left !== null) {\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\n}\n}\n
binary_search_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nfunction remove(num: number): void {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root === null) {\nreturn;\n}\nlet cur = root,\npre: TreeNode | null = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur !== null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val === num) {\nbreak;\n}\npre = cur;\nif (cur.val < num) {\ncur = cur.right as TreeNode; // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n} else {\ncur = cur.left as TreeNode; // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur === null) {\nreturn;\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left === null || cur.right === null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nlet child = cur.left !== null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre!.left === cur) {\npre!.left = child;\n} else {\npre!.right = child;\n}\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nlet tmp = cur.right;\nwhile (tmp.left !== null) {\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp!.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\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 removeNode(binarySearchTree *bst, int num) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (bst->root == NULL)\nreturn;\nTreeNode *cur = bst->root, *pre = NULL;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != NULL) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur->val == num)\nbreak;\npre = cur;\nif (cur->val < num) {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\ncur = cur->right;\n} else {\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\ncur = cur->left;\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == NULL)\nreturn;\n// \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\nif (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\nTreeNode *child = cur->left != NULL ? cur->left : cur->right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre->left == cur) {\npre->left = child;\n} else {\npre->right = 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\nTreeNode *tmp = cur->right;\nwhile (tmp->left != NULL) {\ntmp = tmp->left;\n}\nint tmpVal = tmp->val;\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremoveNode(bst, tmp->val);\n// \u7528 tmp \u8986\u76d6 cur\ncur->val = tmpVal;\n}\n}\n
binary_search_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num)\n{\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif (root == null) return;\nTreeNode? cur = root, pre = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null)\n{\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.val == num) break;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.val < num) cur = cur.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse cur = cur.left;\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == null || pre == null) return;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.left == null || cur.right == null)\n{\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nTreeNode? child = cur.left != null ? cur.left : cur.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.left == cur)\n{\npre.left = child;\n}\nelse\n{\npre.right = child;\n}\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse\n{\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nTreeNode? tmp = cur.right;\nwhile (tmp.left != null)\n{\ntmp = tmp.left;\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(tmp.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.val = tmp.val;\n}\n}\n
binary_search_tree.swift
/* \u5220\u9664\u8282\u70b9 */\n@discardableResult\nfunc remove(num: Int) {\n// \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\nif root == nil {\nreturn\n}\nvar cur = root\nvar pre: TreeNode?\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile cur != nil {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif cur!.val == num {\nbreak\n}\npre = cur\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif cur!.val < num {\ncur = cur?.right\n}\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\nelse {\ncur = cur?.left\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif cur == nil {\nreturn\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif cur?.left == nil || cur?.right == nil {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nlet child = cur?.left != nil ? cur?.left : cur?.right\n// \u5220\u9664\u8282\u70b9 cur\nif pre?.left === cur {\npre?.left = child\n} else {\npre?.right = child\n}\n}\n// \u5b50\u8282\u70b9\u6570\u91cf = 2\nelse {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\nlet tmp = cur?.right\nwhile tmp?.left != nil {\ntmp = tmp?.left\n}\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\nremove(num: tmp!.val)\n// \u7528 tmp \u8986\u76d6 cur\ncur?.val = tmp!.val\n}\n}\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\nif (self.root == null) return;\nvar cur = self.root;\nvar pre: ?*inc.TreeNode(T) = null;\n// \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\nwhile (cur != null) {\n// \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\nif (cur.?.val == num) break;\npre = cur;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\nif (cur.?.val < num) {\ncur = cur.?.right;\n// \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n} else {\ncur = cur.?.left;\n}\n}\n// \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\nif (cur == null) return;\n// \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\nif (cur.?.left == null or cur.?.right == null) {\n// \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\nvar child = if (cur.?.left != null) cur.?.left else cur.?.right;\n// \u5220\u9664\u8282\u70b9 cur\nif (pre.?.left == cur) {\npre.?.left = child;\n} else {\npre.?.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\nvar tmp = cur.?.right;\nwhile (tmp.?.left != null) {\ntmp = tmp.?.left;\n}\nvar tmpVal = tmp.?.val;\n// \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n_ = self.remove(tmp.?.val);\n// \u7528 tmp \u8986\u76d6 cur\ncur.?.val = tmpVal;\n}\n}\n
"},{"location":"chapter_tree/binary_search_tree/#_4","title":"\u6392\u5e8f","text":"

\u6211\u4eec\u77e5\u9053\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\u56e0\u6b64\uff0c\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\u9700\u989d\u5916\u6392\u5e8f\uff0c\u975e\u5e38\u9ad8\u6548\u3002

Fig. \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217

"},{"location":"chapter_tree/binary_search_tree/#842","title":"8.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\u53ef\u77e5\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\u8868\u73b0\u3002\u53ea\u6709\u5728\u9ad8\u9891\u6dfb\u52a0\u3001\u4f4e\u9891\u67e5\u627e\u5220\u9664\u7684\u6570\u636e\u9002\u7528\u573a\u666f\u4e0b\uff0c\u6570\u7ec4\u6bd4\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387\u66f4\u9ad8\u3002

\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\u94fe\u8868\uff0c\u8fd9\u65f6\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4f1a\u9000\u5316\u4e3a \\(O(n)\\) \u3002

Fig. \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5e73\u8861\u4e0e\u9000\u5316

"},{"location":"chapter_tree/binary_search_tree/#843","title":"8.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":"8.1. \u00a0 \u4e8c\u53c9\u6811","text":"

\u300c\u4e8c\u53c9\u6811 Binary Tree\u300d\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4ee3\u8868\u7740\u7956\u5148\u4e0e\u540e\u4ee3\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff0c\u4f53\u73b0\u7740\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\u4e00\u4e2a\u300c\u503c\u300d\u548c\u4e24\u4e2a\u300c\u6307\u9488\u300d\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nint val;         // \u8282\u70b9\u503c\nTreeNode left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nTreeNode right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nTreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\nint val;          // \u8282\u70b9\u503c\nTreeNode *left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nTreeNode *right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nTreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
class TreeNode:\n\"\"\"\u4e8c\u53c9\u6811\u8282\u70b9\u7c7b\"\"\"\ndef __init__(self, val: int):\nself.val: int = val                   # \u8282\u70b9\u503c\nself.left: Optional[TreeNode] = None  # \u5de6\u5b50\u8282\u70b9\u6307\u9488\nself.right: Optional[TreeNode] = None # \u53f3\u5b50\u8282\u70b9\u6307\u9488\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\nVal   int\nLeft  *TreeNode\nRight *TreeNode\n}\n/* \u8282\u70b9\u521d\u59cb\u5316\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\nreturn &TreeNode{\nLeft:  nil,\nRight: nil,\nVal:   v,\n}\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nfunction TreeNode(val, left, right) {\nthis.val = (val === undefined ? 0 : val); // \u8282\u70b9\u503c\nthis.left = (left === undefined ? null : left); // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nthis.right = (right === undefined ? null : right); // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nval: number;\nleft: TreeNode | null;\nright: TreeNode | null;\nconstructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\nthis.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\nthis.left = left === undefined ? null : left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nthis.right = right === undefined ? null : right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n}\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\nint val;                // \u8282\u70b9\u503c\nint height;             // \u8282\u70b9\u9ad8\u5ea6\nstruct TreeNode *left;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nstruct TreeNode *right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n};\ntypedef struct TreeNode TreeNode;\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\nTreeNode *node;\nnode = (TreeNode *)malloc(sizeof(TreeNode));\nnode->val = val;\nnode->height = 0;\nnode->left = NULL;\nnode->right = NULL;\nreturn node;\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nint val;          // \u8282\u70b9\u503c\nTreeNode? left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nTreeNode? right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\nTreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\nvar val: Int // \u8282\u70b9\u503c\nvar left: TreeNode? // \u5de6\u5b50\u8282\u70b9\u6307\u9488\nvar right: TreeNode? // \u53f3\u5b50\u8282\u70b9\u6307\u9488\ninit(x: Int) {\nval = x\n}\n}\n
\n

\u8282\u70b9\u7684\u4e24\u4e2a\u6307\u9488\u5206\u522b\u6307\u5411\u300c\u5de6\u5b50\u8282\u70b9\u300d\u548c\u300c\u53f3\u5b50\u8282\u70b9\u300d\uff0c\u540c\u65f6\u8be5\u8282\u70b9\u88ab\u79f0\u4e3a\u8fd9\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u300c\u7236\u8282\u70b9\u300d\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\u300c\u5de6\u5b50\u6811\u300d\uff0c\u540c\u7406\u53ef\u5f97\u300c\u53f3\u5b50\u6811\u300d\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\u4f8b\u5982\uff0c\u5728\u4ee5\u4e0b\u793a\u4f8b\u4e2d\uff0c\u82e5\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

Fig. \u7236\u8282\u70b9\u3001\u5b50\u8282\u70b9\u3001\u5b50\u6811

"},{"location":"chapter_tree/binary_tree/#811","title":"8.1.1. \u00a0 \u4e8c\u53c9\u6811\u5e38\u89c1\u672f\u8bed","text":"

\u4e8c\u53c9\u6811\u6d89\u53ca\u7684\u672f\u8bed\u8f83\u591a\uff0c\u5efa\u8bae\u5c3d\u91cf\u7406\u89e3\u5e76\u8bb0\u4f4f\u3002

  • \u300c\u6839\u8282\u70b9 Root Node\u300d\uff1a\u4f4d\u4e8e\u4e8c\u53c9\u6811\u9876\u5c42\u7684\u8282\u70b9\uff0c\u6ca1\u6709\u7236\u8282\u70b9\uff1b
  • \u300c\u53f6\u8282\u70b9 Leaf Node\u300d\uff1a\u6ca1\u6709\u5b50\u8282\u70b9\u7684\u8282\u70b9\uff0c\u5176\u4e24\u4e2a\u6307\u9488\u5747\u6307\u5411 \\(\\text{null}\\) \uff1b
  • \u8282\u70b9\u7684\u300c\u5c42 Level\u300d\uff1a\u4ece\u9876\u81f3\u5e95\u9012\u589e\uff0c\u6839\u8282\u70b9\u6240\u5728\u5c42\u4e3a 1 \uff1b
  • \u8282\u70b9\u7684\u300c\u5ea6 Degree\u300d\uff1a\u8282\u70b9\u7684\u5b50\u8282\u70b9\u7684\u6570\u91cf\u3002\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u5ea6\u7684\u8303\u56f4\u662f 0, 1, 2 \uff1b
  • \u300c\u8fb9 Edge\u300d\uff1a\u8fde\u63a5\u4e24\u4e2a\u8282\u70b9\u7684\u7ebf\u6bb5\uff0c\u5373\u8282\u70b9\u6307\u9488\uff1b
  • \u4e8c\u53c9\u6811\u7684\u300c\u9ad8\u5ea6\u300d\uff1a\u4ece\u6839\u8282\u70b9\u5230\u6700\u8fdc\u53f6\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\uff1b
  • \u8282\u70b9\u7684\u300c\u6df1\u5ea6 Depth\u300d \uff1a\u4ece\u6839\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\uff1b
  • \u8282\u70b9\u7684\u300c\u9ad8\u5ea6 Height\u300d\uff1a\u4ece\u6700\u8fdc\u53f6\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\uff1b

Fig. \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed

\u9ad8\u5ea6\u4e0e\u6df1\u5ea6\u7684\u5b9a\u4e49

\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u300c\u9ad8\u5ea6\u300d\u548c\u300c\u6df1\u5ea6\u300d\u5b9a\u4e49\u4e3a\u201c\u8d70\u8fc7\u8fb9\u7684\u6570\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u9898\u76ee\u6216\u6559\u6750\u53ef\u80fd\u4f1a\u5c06\u5176\u5b9a\u4e49\u4e3a\u201c\u8d70\u8fc7\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/#812","title":"8.1.2. \u00a0 \u4e8c\u53c9\u6811\u57fa\u672c\u64cd\u4f5c","text":"

\u521d\u59cb\u5316\u4e8c\u53c9\u6811\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u8282\u70b9\uff0c\u7136\u540e\u6784\u5efa\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\u3002

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\u5f15\u7528\u6307\u5411\uff08\u5373\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\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
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\u5f15\u7528\u6307\u5411\uff08\u5373\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\u5f15\u7528\u6307\u5411\uff08\u5373\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),\nn2 = new TreeNode(2),\nn3 = new TreeNode(3),\nn4 = new TreeNode(4),\nn5 = new TreeNode(5);\n// \u6784\u5efa\u5f15\u7528\u6307\u5411\uff08\u5373\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),\nn2 = new TreeNode(2),\nn3 = new TreeNode(3),\nn4 = new TreeNode(4),\nn5 = new TreeNode(5);\n// \u6784\u5efa\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = 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\u5f15\u7528\u6307\u5411\uff08\u5373\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 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\u5f15\u7528\u6307\u5411\uff08\u5373\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\u5f15\u7528\u6307\u5411\uff08\u5373\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.zig
\n

\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u901a\u8fc7\u4fee\u6539\u6307\u9488\u6765\u5b9e\u73b0\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u3002

Fig. \u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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.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.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.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.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.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.cs
/* \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.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.zig
\n

Note

\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\u64cd\u4f5c\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/#813","title":"8.1.3. \u00a0 \u5e38\u89c1\u4e8c\u53c9\u6811\u7c7b\u578b","text":""},{"location":"chapter_tree/binary_tree/#_1","title":"\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u300c\u5b8c\u7f8e\u4e8c\u53c9\u6811 Perfect Binary Tree\u300d\u9664\u4e86\u6700\u5e95\u5c42\u5916\uff0c\u5176\u4f59\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\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

\u5728\u4e2d\u6587\u793e\u533a\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u5e38\u88ab\u79f0\u4e3a\u300c\u6ee1\u4e8c\u53c9\u6811\u300d\uff0c\u8bf7\u6ce8\u610f\u533a\u5206\u3002

Fig. \u5b8c\u7f8e\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#_2","title":"\u5b8c\u5168\u4e8c\u53c9\u6811","text":"

\u300c\u5b8c\u5168\u4e8c\u53c9\u6811 Complete Binary Tree\u300d\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

Fig. \u5b8c\u5168\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#_3","title":"\u5b8c\u6ee1\u4e8c\u53c9\u6811","text":"

\u300c\u5b8c\u6ee1\u4e8c\u53c9\u6811 Full Binary Tree\u300d\u9664\u4e86\u53f6\u8282\u70b9\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\u3002

Fig. \u5b8c\u6ee1\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#_4","title":"\u5e73\u8861\u4e8c\u53c9\u6811","text":"

\u300c\u5e73\u8861\u4e8c\u53c9\u6811 Balanced Binary Tree\u300d\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

Fig. \u5e73\u8861\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#814","title":"8.1.4. \u00a0 \u4e8c\u53c9\u6811\u7684\u9000\u5316","text":"

\u5f53\u4e8c\u53c9\u6811\u7684\u6bcf\u5c42\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u65f6\uff0c\u8fbe\u5230\u300c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u300d\uff1b\u800c\u5f53\u6240\u6709\u8282\u70b9\u90fd\u504f\u5411\u4e00\u4fa7\u65f6\uff0c\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u300c\u94fe\u8868\u300d\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\uff1b
  • \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)\\) \uff1b

Fig. \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u4e0e\u6700\u5dee\u7ed3\u6784

\u5982\u4e0b\u8868\u6240\u793a\uff0c\u5728\u6700\u4f73\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\u6216\u6781\u5c0f\u503c\u3002

\u5b8c\u7f8e\u4e8c\u53c9\u6811 \u94fe\u8868 \u7b2c \\(i\\) \u5c42\u7684\u8282\u70b9\u6570\u91cf \\(2^{i-1}\\) \\(1\\) \u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \u65f6\u7684\u53f6\u8282\u70b9\u6570\u91cf \\(2^h\\) \\(1\\) \u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \u65f6\u7684\u8282\u70b9\u603b\u6570 \\(2^{h+1} - 1\\) \\(h + 1\\) \u6811\u7684\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \u65f6\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"8.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/#821","title":"8.2.1. \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

\u300c\u5c42\u5e8f\u904d\u5386 Level-Order Traversal\u300d\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\u300c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 Breadth-First Traversal\u300d\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u641c\u7d22\u65b9\u5f0f\u3002

Fig. \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386

"},{"location":"chapter_tree/binary_tree_traversal/#_1","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u901a\u5e38\u501f\u52a9\u300c\u961f\u5217\u300d\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

JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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\nQueue<TreeNode> queue = new LinkedList<>() {{ add(root); }};\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nList<Integer> list = new ArrayList<>();\nwhile (!queue.isEmpty()) {\nTreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\nlist.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left != null)\nqueue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node.right != null)\nqueue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn list;\n}\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\nqueue<TreeNode *> queue;\nqueue.push(root);\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nvector<int> vec;\nwhile (!queue.empty()) {\nTreeNode *node = queue.front();\nqueue.pop();              // \u961f\u5217\u51fa\u961f\nvec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node->left != nullptr)\nqueue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node->right != nullptr)\nqueue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn vec;\n}\n
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\nqueue: deque[TreeNode] = deque()\nqueue.append(root)\n# \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nres: list[int] = []\nwhile queue:\nnode: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\nres.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\nif node.left is not None:\nqueue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif node.right is not None:\nqueue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\nreturn res\n
binary_tree_bfs.go
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []int {\n// \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\nqueue := list.New()\nqueue.PushBack(root)\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nnums := make([]int, 0)\nfor queue.Len() > 0 {\n// \u961f\u5217\u51fa\u961f\nnode := queue.Remove(queue.Front()).(*TreeNode)\n// \u4fdd\u5b58\u8282\u70b9\u503c\nnums = append(nums, node.Val)\nif node.Left != nil {\n// \u5de6\u5b50\u8282\u70b9\u5165\u961f\nqueue.PushBack(node.Left)\n}\nif node.Right != nil {\n// \u53f3\u5b50\u8282\u70b9\u5165\u961f\nqueue.PushBack(node.Right)\n}\n}\nreturn nums\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\nconst queue = [root];\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nconst list = [];\nwhile (queue.length) {\nlet node = queue.shift(); // \u961f\u5217\u51fa\u961f\nlist.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn 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\nconst queue = [root];\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nconst list: number[] = [];\nwhile (queue.length) {\nlet node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\nlist.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left) {\nqueue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n}\nif (node.right) {\nqueue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\n}\nreturn list;\n}\n
binary_tree_bfs.c
/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n/* \u8f85\u52a9\u961f\u5217 */\nint front, rear;\nint index, *arr;\nTreeNode *node;\nTreeNode **queue;\n/* \u8f85\u52a9\u961f\u5217 */\nqueue = (TreeNode **)malloc(sizeof(TreeNode) * MAX_NODE_SIZE);\n// \u961f\u5217\u6307\u9488\nfront = 0, rear = 0;\n// \u52a0\u5165\u6839\u8282\u70b9\nqueue[rear++] = root;\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n/* \u8f85\u52a9\u6570\u7ec4 */\narr = (int *)malloc(sizeof(int) * MAX_NODE_SIZE);\n// \u6570\u7ec4\u6307\u9488\nindex = 0;\nwhile (front < rear) {\n// \u961f\u5217\u51fa\u961f\nnode = queue[front++];\n// \u4fdd\u5b58\u8282\u70b9\u503c\narr[index++] = node->val;\nif (node->left != NULL) {\n// \u5de6\u5b50\u8282\u70b9\u5165\u961f\nqueue[rear++] = node->left;\n}\nif (node->right != NULL) {\n// \u53f3\u5b50\u8282\u70b9\u5165\u961f\nqueue[rear++] = node->right;\n}\n}\n// \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n*size = index;\narr = realloc(arr, sizeof(int) * (*size));\nreturn arr;\n}\n
binary_tree_bfs.cs
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode root)\n{\n// \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\nQueue<TreeNode> queue = new();\nqueue.Enqueue(root);\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nList<int> list = new();\nwhile (queue.Count != 0)\n{\nTreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\nlist.Add(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left != null)\nqueue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\nif (node.right != null)\nqueue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\nreturn list;\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\nvar queue: [TreeNode] = [root]\n// \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nvar list: [Int] = []\nwhile !queue.isEmpty {\nlet node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\nlist.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\nif let left = node.left {\nqueue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n}\nif let right = node.right {\nqueue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}\n}\nreturn list\n}\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\nconst L = std.TailQueue(*inc.TreeNode(T));\nvar queue = L{};\nvar root_node = try mem_allocator.create(L.Node);\nroot_node.data = root;\nqueue.append(root_node); // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\nvar list = std.ArrayList(T).init(std.heap.page_allocator);\nwhile (queue.len > 0) {\nvar queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\nvar node = queue_node.data;\ntry list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\nif (node.left != null) {\nvar tmp_node = try mem_allocator.create(L.Node);\ntmp_node.data = node.left.?;\nqueue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n}\nif (node.right != null) {\nvar tmp_node = try mem_allocator.create(L.Node);\ntmp_node.data = node.right.?;\nqueue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n}        }\nreturn list;\n}\n
"},{"location":"chapter_tree/binary_tree_traversal/#_2","title":"\u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\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\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 \\(\\frac{n + 1}{2}\\) \u4e2a\u8282\u70b9\uff0c\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#822","title":"8.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\u300c\u6df1\u5ea6\u4f18\u5148\u904d\u5386 Depth-First Traversal\u300d\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

\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5de6\u4fa7\u662f\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u793a\u610f\u56fe\uff0c\u53f3\u4e0a\u65b9\u662f\u5bf9\u5e94\u7684\u9012\u5f52\u5b9e\u73b0\u4ee3\u7801\u3002\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5c31\u50cf\u662f\u7ed5\u7740\u6574\u4e2a\u4e8c\u53c9\u6811\u7684\u5916\u56f4\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\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

Fig. \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u524d\u3001\u4e2d\u3001\u540e\u5e8f\u904d\u5386

\u4f4d\u7f6e \u542b\u4e49 \u6b64\u5904\u8bbf\u95ee\u8282\u70b9\u65f6\u5bf9\u5e94 \u6a59\u8272\u5706\u5708\u5904 \u521a\u8fdb\u5165\u6b64\u8282\u70b9\uff0c\u5373\u5c06\u8bbf\u95ee\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u6811 \u524d\u5e8f\u904d\u5386 Pre-Order Traversal \u84dd\u8272\u5706\u5708\u5904 \u5df2\u8bbf\u95ee\u5b8c\u5de6\u5b50\u6811\uff0c\u5373\u5c06\u8bbf\u95ee\u53f3\u5b50\u6811 \u4e2d\u5e8f\u904d\u5386 In-Order Traversal \u7d2b\u8272\u5706\u5708\u5904 \u5df2\u8bbf\u95ee\u5b8c\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff0c\u5373\u5c06\u8fd4\u56de \u540e\u5e8f\u904d\u5386 Post-Order Traversal"},{"location":"chapter_tree/binary_tree_traversal/#_3","title":"\u7b97\u6cd5\u5b9e\u73b0","text":"JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_tree_dfs.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\nif (root == null)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.add(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\nif (root == null)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.add(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\nif (root == null)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.add(root.val);\n}\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\nif (root == nullptr)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nvec.push_back(root->val);\npreOrder(root->left);\npreOrder(root->right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\nif (root == nullptr)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root->left);\nvec.push_back(root->val);\ninOrder(root->right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\nif (root == nullptr)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root->left);\npostOrder(root->right);\nvec.push_back(root->val);\n}\n
binary_tree_dfs.py
def pre_order(root: TreeNode | None) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nres.append(root.val)\npre_order(root=root.left)\npre_order(root=root.right)\ndef in_order(root: TreeNode | None) -> None:\n\"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\nin_order(root=root.left)\nres.append(root.val)\nin_order(root=root.right)\ndef post_order(root: TreeNode | None) -> None:\n\"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\nif root is None:\nreturn\n# \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npost_order(root=root.left)\npost_order(root=root.right)\nres.append(root.val)\n
binary_tree_dfs.go
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\nif node == nil {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nnums = append(nums, node.Val)\npreOrder(node.Left)\npreOrder(node.Right)\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\nif node == nil {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(node.Left)\nnums = append(nums, node.Val)\ninOrder(node.Right)\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\nif node == nil {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(node.Left)\npostOrder(node.Right)\nnums = append(nums, node.Val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\nif (root === null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.push(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\nif (root === null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.push(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\nif (root === null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\nif (root === null) {\nreturn;\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.push(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\nif (root === null) {\nreturn;\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.push(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\nif (root === null) {\nreturn;\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.push(root.val);\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\nif (root == NULL)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\narr[(*size)++] = root->val;\npreOrder(root->left, size);\npreOrder(root->right, size);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\nif (root == NULL)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root->left, size);\narr[(*size)++] = root->val;\ninOrder(root->right, size);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\nif (root == NULL)\nreturn;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root->left, size);\npostOrder(root->right, size);\narr[(*size)++] = root->val;\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? root)\n{\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.Add(root.val);\npreOrder(root.left);\npreOrder(root.right);\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? root)\n{\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root.left);\nlist.Add(root.val);\ninOrder(root.right);\n}\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? root)\n{\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root.left);\npostOrder(root.right);\nlist.Add(root.val);\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\nlist.append(root.val)\npreOrder(root: root.left)\npreOrder(root: root.right)\n}\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ninOrder(root: root.left)\nlist.append(root.val)\ninOrder(root: root.right)\n}\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\npostOrder(root: root.left)\npostOrder(root: root.right)\nlist.append(root.val)\n}\n
binary_tree_dfs.zig
// \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\ntry list.append(root.?.val);\ntry preOrder(T, root.?.left);\ntry preOrder(T, root.?.right);\n}\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\ntry inOrder(T, root.?.left);\ntry list.append(root.?.val);\ntry inOrder(T, root.?.right);\n}\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\nif (root == null) return;\n// \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\ntry postOrder(T, root.?.left);\ntry postOrder(T, root.?.right);\ntry list.append(root.?.val);\n}\n

Note

\u6211\u4eec\u4e5f\u53ef\u4ee5\u4ec5\u57fa\u4e8e\u5faa\u73af\u5b9e\u73b0\u524d\u3001\u4e2d\u3001\u540e\u5e8f\u904d\u5386\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

\u9012\u5f52\u8fc7\u7a0b\u53ef\u5206\u4e3a\u201c\u9012\u201d\u548c\u201c\u5f52\u201d\u4e24\u4e2a\u76f8\u53cd\u7684\u90e8\u5206\u3002\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\uff1b\u201c\u5f52\u201d\u8868\u793a\u51fd\u6570\u8fd4\u56de\uff0c\u4ee3\u8868\u8be5\u8282\u70b9\u5df2\u7ecf\u8bbf\u95ee\u5b8c\u6bd5\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u4e3a\u524d\u5e8f\u904d\u5386\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\u3002

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

"},{"location":"chapter_tree/binary_tree_traversal/#_4","title":"\u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\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\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":"8.6. \u00a0 \u5c0f\u7ed3","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\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\u201d\u7684\u5206\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\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u5934\u7ee7\u7eed\u201d\u7684\u56de\u6eaf\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\u4e3a\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5b83\u901a\u8fc7\u65cb\u8f6c\u64cd\u4f5c\uff0c\u786e\u4fdd\u5728\u4e0d\u65ad\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\u540e\uff0c\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
"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 264beef65f986e5a3921926e6ae57a87799efd04..a26b0f02d9cde5187bf8c6c6443f4fa09fae2fd0 100644 GIT binary patch delta 15 WcmdnZx|@|vzMF$%|E7&>TbTeT4h0|p delta 15 WcmdnZx|@|vzMF&N+MJDSTbTeTDg_|`