From 5d3d1d12b9d2d8fd32c6d7a8a7c29d00e3835cd6 Mon Sep 17 00:00:00 2001 From: krahets Date: Thu, 1 Jun 2023 18:47:10 +0800 Subject: [PATCH] deploy --- .../covers/chapter_array_and_linkedlist.jpg | Bin 0 -> 108246 bytes assets/covers/chapter_backtracking.jpg | Bin 0 -> 129559 bytes assets/covers/chapter_complexity_analysis.jpg | Bin 0 -> 95506 bytes assets/covers/chapter_data_structure.jpg | Bin 0 -> 99371 bytes assets/covers/chapter_dynamic_programming.jpg | Bin 0 -> 71181 bytes assets/covers/chapter_graph.jpg | Bin 0 -> 85373 bytes assets/covers/chapter_hash_map.jpg | Bin 0 -> 139716 bytes assets/covers/chapter_heap.jpg | Bin 0 -> 98261 bytes assets/covers/chapter_introduction.jpg | Bin 0 -> 136598 bytes assets/covers/chapter_preface.jpg | Bin 0 -> 121897 bytes assets/covers/chapter_searching.jpg | Bin 0 -> 131797 bytes assets/covers/chapter_sorting_algorithm.jpg | Bin 0 -> 49275 bytes assets/covers/chapter_stack_and_queue.jpg | Bin 0 -> 104652 bytes assets/covers/chapter_tree.jpg | Bin 0 -> 120397 bytes chapter_appendix/contribution/index.html | 2 +- chapter_appendix/installation/index.html | 2 +- chapter_array_and_linkedlist/array/index.html | 2 +- .../linked_list/index.html | 2 +- chapter_array_and_linkedlist/list/index.html | 2 +- .../summary/index.html | 2 +- .../backtracking_algorithm/index.html | 4 +- .../n_queens_problem/index.html | 2 +- .../permutations_problem/index.html | 2 +- .../performance_evaluation/index.html | 2 +- .../space_complexity/index.html | 2 +- .../summary/index.html | 2 +- .../time_complexity/index.html | 2 +- .../basic_data_types/index.html | 2 +- .../character_encoding/index.html | 2 +- .../index.html | 2 +- .../number_encoding/index.html | 2 +- chapter_data_structure/summary/index.html | 2 +- chapter_graph/graph/index.html | 2 +- chapter_graph/graph_operations/index.html | 2 +- chapter_graph/graph_traversal/index.html | 2 +- chapter_graph/summary/index.html | 2 +- chapter_hashing/hash_collision/index.html | 4 +- chapter_hashing/hash_map/index.html | 2 +- chapter_hashing/summary/index.html | 2 +- chapter_heap/build_heap/index.html | 2 +- chapter_heap/heap/index.html | 2 +- chapter_heap/summary/index.html | 2 +- .../algorithms_are_everywhere/index.html | 2 +- chapter_introduction/summary/index.html | 2 +- chapter_introduction/what_is_dsa/index.html | 2 +- chapter_preface/about_the_book/index.html | 4 +- chapter_preface/suggestions/index.html | 52 ++++---- chapter_preface/summary/index.html | 2 +- chapter_searching/binary_search/index.html | 2 +- .../binary_search_edge/index.html | 2 +- .../replace_linear_by_hashing/index.html | 2 +- .../searching_algorithm_revisited/index.html | 2 +- chapter_searching/summary/index.html | 2 +- chapter_sorting/bubble_sort/index.html | 2 +- chapter_sorting/bucket_sort/index.html | 2 +- chapter_sorting/counting_sort/index.html | 2 +- chapter_sorting/heap_sort/index.html | 2 +- chapter_sorting/insertion_sort/index.html | 2 +- chapter_sorting/merge_sort/index.html | 2 +- chapter_sorting/quick_sort/index.html | 2 +- chapter_sorting/radix_sort/index.html | 2 +- chapter_sorting/selection_sort/index.html | 2 +- chapter_sorting/sorting_algorithm/index.html | 2 +- chapter_sorting/summary/index.html | 2 +- chapter_stack_and_queue/deque/index.html | 2 +- chapter_stack_and_queue/queue/index.html | 2 +- chapter_stack_and_queue/stack/index.html | 2 +- chapter_stack_and_queue/summary/index.html | 2 +- .../array_representation_of_tree/index.html | 2 +- chapter_tree/avl_tree/index.html | 2 +- chapter_tree/binary_search_tree/index.html | 2 +- chapter_tree/binary_tree/index.html | 2 +- chapter_tree/binary_tree_traversal/index.html | 2 +- chapter_tree/summary/index.html | 2 +- index.html | 2 +- overrides/partials/comments.html | 2 +- search/search_index.json | 2 +- sitemap.xml | 124 +++++++++--------- sitemap.xml.gz | Bin 743 -> 743 bytes 79 files changed, 153 insertions(+), 153 deletions(-) create mode 100644 assets/covers/chapter_array_and_linkedlist.jpg create mode 100644 assets/covers/chapter_backtracking.jpg create mode 100644 assets/covers/chapter_complexity_analysis.jpg create mode 100644 assets/covers/chapter_data_structure.jpg create mode 100644 assets/covers/chapter_dynamic_programming.jpg create mode 100644 assets/covers/chapter_graph.jpg create mode 100644 assets/covers/chapter_hash_map.jpg create mode 100644 assets/covers/chapter_heap.jpg create mode 100644 assets/covers/chapter_introduction.jpg create mode 100644 assets/covers/chapter_preface.jpg create mode 100644 assets/covers/chapter_searching.jpg create mode 100644 assets/covers/chapter_sorting_algorithm.jpg create mode 100644 assets/covers/chapter_stack_and_queue.jpg create mode 100644 assets/covers/chapter_tree.jpg diff --git a/assets/covers/chapter_array_and_linkedlist.jpg b/assets/covers/chapter_array_and_linkedlist.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a40a55f098a7396c268ec0a8ee02217d1eed3e9b GIT binary patch literal 108246 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

x)4|kui`qRcBkez2YZ;K1Hb6*hs>hizd>J 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

NX}%-+O6>D|S9FxdK~0OhK1Bx2Py|Uo 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
;9605nb+5s%^3K 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®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 z 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 literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_complexity_analysis.jpg b/assets/covers/chapter_complexity_analysis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a9e3d8546c8abd0601644863ac4ab5f70a05753 GIT binary patch literal 95506 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[yHc9o)8rbe}nU;JLbNYsj3; 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

i=ZUL)nHm=(1Vs_nLr>m^r%MqWWSTMrJi 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

xn#U;h9E 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 literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_data_structure.jpg b/assets/covers/chapter_data_structure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f1972c1131c28ed7692513ad78b27701e9e0de8 GIT binary patch literal 99371 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

JI0X7Oa`FN67`6;5}0 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

u`K>`^7G6bT#=`Ed(3X15eNkTGt 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

    llVfk`-Mm6Z4;&V3 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 literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_heap.jpg b/assets/covers/chapter_heap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52f4bc2edb0379a35a48f38269793ca7c2d477fd GIT binary patch literal 98261 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 e>&YGs+SY+gl)f!kV3=( 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 literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_introduction.jpg b/assets/covers/chapter_introduction.jpg new file mode 100644 index 0000000000000000000000000000000000000000..359d767d76e9acffb14bf80069b13d11b8f981a0 GIT binary patch literal 136598 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 Z-m#RaX)cm*)It%SW^~!ZOE&`uz5v`X2S)0As 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%0AVjM=gIQhl3U?H&WXi7n(> z1l;ZyOsk}RFaH3Bw4sF}K&mu>!masmuP@_5_a0`_Fk0)yhPalRwnF!JeUMPvjfPz7 zGrjIvf_CT+=1u*=I4AsR{lxL?_U2aMg0B{CRgtxg%#FI68Rs@00-n#OeZf`Nw!;n= zZL?UD00m{UT#{-2;`TZR3@bWAY&lUf7TlaGk-A5Kq0ZF^-86%chyLIn8rP0aoh0CL ztW{vLi}S6Ww%c_u9@K0{;v&Q5X^^%oMa_mJW`O^kKgNWfTGJfVFqGb9TmoFL3to3HH*>-XG~fTheH^V@ppVRb)KtA^W!Fuoe_C zx!labOqSGb$WY{i#hQ=puc@dlxZ9^2)^wspa;|PgPzENzUbLD#N967ck_-9LvQF|G zPr|JiZ{16h=^V}!>^-J5>Y24$fWT3P%_$VwyGs#5Nhy)=G;^_zOBpe>6?7=lfGUiD ztA?q#nGCo(C}N0N6biF7g;2PvG?aM*h`#Zx39OKfxSU43O*PynxzM@sraNBSLVK(_ zn=dMQg2RZZwty<&6jobJs$#~P?h|QUBh1z_Pt<6zCDd|#&kNG#Yu=NVd%ks1E;P$w zS~2%H?qu_-ioW1~+&`UE3PrI(MH(TE=t7Qy%UIA@o10Qw=Q2tmT$eg@bgM{mQF=jc zNptFBdL~4u5sM7!=@Uq3n|-s&;Z$6j^jjX#kf?b@+m$_O)#!w^<3+16pzYEyzM5oq z)5KQsR8e3)6uW}Q0ZpewPhPCcUfmM!&k~C%D~34^OH?lK%iY&p@er z1d>SNTbxhQqcUn&csB7!@&0D$fv9j$cn<+dJG3nx<8Y;s{Y(L}cvB4&8>ML=oT&f+ ztLgKuOt$9I*N2Bv^{T3!IetJBakSpbu`s;wTPx7cMGDAvj<8f)cC1~oUQl6*;aCWb{`#MOcTKqBmNQCb5je!z5^ zv}g$Fv2Ikrhzsf$V}<#7P{cZQlWeRjp7|3`i`(%!aO3sWSua=Mb4G9n;!Z+=WG$t- zR2*$q=@?kvs@4|5lAFfoUTjfD(^?uo>b7?oeCpG0<$Ek6*^Fcd ztKw-MJ3BO%kE__#$dXO(UW8DepFS({nd|b=fc##}nW0~hdkbYxYncQtAfCdLr9LV5#8d}wAwDnF-OD42x3fim? z@xr7Eu_pm~B9Wk1RM%ECfvFs8kf>l>U2ll+r(}*f!o{-3osE@6UvsyUZ83&I3jhcsA`NN93Tz{?_3j@Ame>#JS{~vb)W@RzVBR)7 z`5!tt9WljTx1D2ZuiR`nvSm*tbfkJ`d%o+y%%?kJgxs5(22-DfEfiDDFx$fuNx5UB zLZa<|D)ya=_LkqbultvJWs+!yu?WT}t@ytaeUu)+Tb0=Mzjh(J-(D@L{@i&!X*4F{OFKw1N676_}7*1FMDXdh10*8+lw42 ze^=x&P}Wg%U8r$3s+%@EI9DDzJ2*uffCLt6^P(!)TCHlZ72l5^5_Yte2}D#PtgA*; z!m9#FL?mHFPz`p9l~O3c3eN$TZ!BZf%5CN`tZlQDktE`z5*FQ zFH-saLb^S@qH6k(%%&e>S8>`qZtt#07VIt=dQLu6n||2aUhz#Lat6#RL$=HAZB!H0 zA4`4I-A>hp*I|?Dk38SCNjDpfL}jQ~LHlxe8sbG^#9}MZ*HXI5hTfxdXP?~mE!?aM zI)wuxdLR2IafN|~&-kuwUXr?p+fl}J>~3vpjA%P{`#Dh*@BrS5`yKs&iI>E&%KWQR zpwRmjGs|xS9QIwzgG{rnxdB#A!w?pdV#B~zp{g2XimSiOKYu55ypk4+wd|oc4CLkN z;ZQqgYFT~Zwo@GGe7BLJple;9DFM`0ZMe}4tdV|aqb)-Od}p2i{nh}e>!%T{U`<=b)N23 zL~)C|U;wRC7}<8=5cRfanK{zeS0h_R9|JRWA$b|RX(!NY1%~6@GLMv=En-w+Wy&Kpzmi3&N#mIH1l@? z7eq=UL4XP^Y8viUi87K$3}{VPiJvFnJGJedyK9UPuCK;=o95KzV-4_(=Y>Sw-Pmc5 zr~0_ltcp7b=;yhuEb+uTjy$;5bo=*w7o}+fJIHe+o;7t_VrgC5@EK7eU9JfAXh-J4LbvFXo(M|x=nkH0H za&V=k-0Q(`T3O}SmQ_Y@qdHsU=!T{~tYAtwnwH#wS~rgg`g}Ses`G;M0=sI&2PgdYty$TYWyKHImZx z8f$YVCbL4{<)z9-04Hrq)ikVhKbjWUo+zujIn z#jruiM-yI~VcX)_M`4VI)YV$mEm<31q5<3cTzfaK*jarDgx0$2By0+<|#;DliofL~Z6(Z$y*!`xs zGGw*>rvCu-S|OTgy4Oz=2e~|(gC5>M1X3MrN7M#Ft93=vfGUiD%AW4g1GZO77KN{I zosI^w8dF}c`0gKOYgl}rBZJ-Z=9QkDMdb!f$5pL+W6G#wLN%(|#|vO^tH?oMTP`P+ z8`&y4$ruJ-5mEOQYa`Y>9lqM><62Ka9p>CbRn&s6HDSQ<6iu{n%7;?*jw1_-(e98z z`b06?rr7h!!xP{CSu5+jZx-*XfrKrsZ=Ss=nHTYuwSw zG(+72;f%**DzHe$8c;f%o>#pP1Ii11Ug6XGt$Qt7ehh_=-D?AZ7?Z-Gwzt2u z;n;mA14M*0V3!>Yfv(n(-IJ-f9#mUt!hS@ANg&+kQHjp3>0_z*eYUS6H3i zus~6XH5aL4z-3jr1QCH4gG?ao5jvxLo|efCUr0e^!9@x^>a$vWKdgP?m!ER;606e{ z@ErW=JTC37pOJsLO4UZcnG@*uTS?RocIQ=%B$`Er6lo-U6%<^Wd$smW=W`*W9@g9* zsoY`yLG>E-yA6+T?P}3&R5ayIxf>Q@KM~>OO>ByumFlwowIKDD^hRH8{h*%NlesnJ zWg#I$(;E?kGkrvSt1D}_{VU72k!`w(iphRMmxX#1+|Feisaq6crYqPF^3vb9_KPGj z_nn~!O_EYLi`X-HWN8|_@w@u;o{HUphc#Q2qmM_sUBplWbzyZlFgaSW_YuV$?vWix z4hEQ)eoAPKbQblWZ~ZNzC}o~1rK4QIrxg<3~#3Ho-v-fU3*8|EmTwrJD5ZDSol zA5)(pT%YytTUj^BPL@4K@33DLEniLe!>5-|f$cj_XWRDFGHDIHln;J;bsK#nz*cwe zP5Can6g?|vm&E-m_tyJ5s+kX@0>t+i^UTF~&wM^E7X?Bc7Vs+5Z4cm3kt% z2I7`eMOLnB(o3rktj0wb%vIth{uH7%7N%orl`-*bdpSc(jS)o!4IOHvm_-z26csd8 zG{{yE3Y|5|YT}qu0@q6l%^$Y@YTtzOqE}ju+Mqp5p)TiVHHS+K$I{}pcAMz8Ld(-2 z^&!vU&Z#sJ&YE0h>0y|x*|w6v+J)>fS6Wu>GW7~oYBo2kt1E5Y9W0xb)<5ble-TYLQzOetF84M}AgkSJ}qh;hG_8Ac?7R3fO`q4cRfbTcfi z#>2w5Bo$U0K_=8TWmAB;s;e@agN<<)H#7!<3$tc^6%`>36(J`&C;-(<8wz0%MlN%y zIwD(|Uvs(;#$<2uj%KrPWvDLWzV=hvjQ(qn`A0g+PLXq+RI|$FN5z=jny^yr5py** z4hbG5)^o8NJQ;J$SBtYb=~QTR@U;BZUkbA*DX4ex@{;lRhNzpa*FIDT=7a!iLhDQoB#UqNE3D zg7KmI&gV)ComlVj%4|oWmy&3Ef%6N?6(h#^p70q zjkj2Z&CMJ2L>{qKZOS$lqX=1IrgdLPp-DTp8wxy$8{#Mp3E_l6vDGXC!&e&ZF}wT#p=RKt*LTq1CVPYHKYurmiSTq&1-Q;oO+VEcMTcJ;N~jHoYtw^ zm$m6D-ix`EI~!#{6d2W77Zqz&DCne$(hDFHEz`=cv@xIYQO@0p7Pn4B)@+aLN>dy% zwHnzr(5*N%fVrq4r;u&q7hBn_^*05i*M7w`qS*0sUWc@7zfTCBQE3=-gY<*pGtSn@2TYcVD67P`?k%^_ZyV5@`4mE+l?<=;va9T~r6Pl-=Gf(2lq~3_x z-*;$s(fga3G%56;#oNhi%XbglJFVF&Y@iS zm!)}?thS)jlX4?gi)nC*dZgmV!iO1@b=;H0oNAD5CYH>ksvO%YJdGf2DoC~hxU*d- ztzpjRMmldlh&NqG%Z21pEyP~1n6fdA@MShN=s!xv(n<(6;l{H2+$bbj(*j1B2Z+em zZ}{BlUE`mxUy3-t$l^|_>-cE=gwdB;>h#=RwjMYmeNICoE&;e73iIL3Y3$)U-Lo>i z_Ysf`Y<`|%_0j%A6Kc5=g@B(?Ex04okf(J5Xk zNIweND;y|{>=JmcWd{{u_;n6dj>^;S02mn?ha*$=jjy=p)4#;%_lY-1UZ(c&HMYRX z5}OuQ!{b#jyiQrvn3Uoui8+X@Q5z~?wa%ci)qIb}xjFjV*;$>n!)sEjcT|L=z1ZIa zjfV;umC6{vxI9fBRSKl@%9gh?SFM$_Yi)^V!0~FE)oMaVsjN+h6Gz&{zVKph66X9W z8{5&TMXiMz1T7nt7`6hn?dfx;LN%|cB@e8is$!U&0V~9g6`e7R$U@);E_C!r;5F2N zYg)6k7n4B4#*-CNwV~-$hrO)nRT|llHv-yNU@EJ3EWlbc#j0i7GFXnKJVics;tt-* z2T@&2d};FDwW{O%+y~oXwemh|Oln`~j49-HZ*YPJN_bSExV?Kd?F!o%_Oe79X(EPa z7&^7C3fGt3?AK+weX>d?Rk04fJR8JSv9%mxAmzK|XKCM2Z6J|+0nF3U_V^eANi?CR zpp}B@<&mV%&L)koA@Mp-sV|6O+IGx1{OD5lM_gfjU((;su6u(-Z~?q2oxgV5Nu+GwB1XZFth;FtZQd#M&n{+PGY$214WF-{emXSrRYHO1|x z{-P6u1J3lE(Il!bg9|b^%}B%$Yff(a+xGi7_j}?FcwR~*3=%Ix*nhNpQzS%3hS;nqr0CDglk&Y=}|p;mIlJr*1mMk)(A{z zb-TZ?r%Fbq%`5T;fE62kp5t`IcG0wiXKa_1*x^miy7X1v&tdqzJbHBjYP=%uYnnGl zXxtTaHf1~rtH8ZRwZ4|aU#SGrE2{cysxn#(g1kj=ehox1k>gb>dg(cacAK*Tv_}}5 z5&bP!*w5{6VwnCcPx!E;)oT1G@_H`9s#P~-y|+Gy+xzx;?t0Y<-_Hv3BP&$wci*Vk z$s0H3B7ozV85*jZm7!R@8{_dht_@JtLt2s2b{$=H8;z-$+OyI@PVHDT0a3MDWmS_O ziuA&Y8Vd?4ic=R+Mo~jrD$zo+;;bqKSW^hg3b3k*xT7FA3b0$$i(ak>ra)jDX$u>a z7pi`XZ+nCQ^QMUuGSp(dfiJmH3jt+g^R6(+exiOgVIUdR)Jw184gsrqSWg@$6ag>gk} z#p@WwDn&|zdf5FmCpD>EoF9gk%%xG96^0dHrnOgL5v%_Iw!}ttIV_;b%7(_ZW$m^E zsjT_nWHvRF4?1Wn%~jPzF_JGqU`0AeM%iVNklaz1aT(78Ni&5QnqBui7w1JLCE=P< ztSyMJG@}&caLiUhnr~&gXeA5|2Ld=+lE`$8BY?GH zcOU&njjLs(3^filhrA{CHc@sq3Or2;KT)k+4KLgK5xLwMWEX}EPbPi>xA)t@3}oLP z6g{K~+ja>Fuw@#hJlx`I%6FdZ+o_s3kL8RB=UppAa$D5N?j7COv~V^j)hFC5D1EhB zn$JeSj{l)aslttz{01AfIIc@Sa+zIErBVvx7Jb{518>(x32 zRtF+6uQ|I!S(#wDPIj)JZ*DeedRyuxmn!PHCD6i}BO76g@IDn-rIIHP8PdazY9`i6 zSm{kbdaspm?J&L0qNj)$iuAwj;*L3bt#p+B2M_%`v&$F5qxp+XyNXCGs>v%JvGgAr zuWyL!X_#Q5%jRjO*ueT=_EMt~*l-ac95ic4Nnx$;x2pv?)ouzhpxVPK zF*@@BPw}Ye$e%k^YbpN6Ke^1ZS4|ULKw9m9y%0+2k<C-|)X7s72+EqE@Qm&Ni+*&oRrhnt{^KQ3__WuA;QMY9p zpAQNXu?#}rJ`~>ORMUkk8OHq0Ju+L1yE(na8dl34eCMb!BPb%k-=7K|dE;6ww^>!MTRbXN|?xhuA@{ zJ{8HZ8S|}f&g91~&9Nvw$h^LxT;A&vU-Hw_YVRMJd>I?`TU7R+$jIF7pKU3Pu^Fp# z6gy#CeZy=fh}+b-tzy{MPq)kWDKF|;GC8sEwwpbTPTLmKxI&vr*^+2UC=}aT97q?f z4gTg$qNdkqKTLsj18h%#`|A!6EEx$|RNYu+2+Fq`zwLx5&jFWo1}Z?%t;{!#LoPe4 zm36DjNq&xs&##d5y?C_RrJ;JeuEJgF7B2?yuAkJP_b|1jQT(Y*supsfT%Hwe-v0n~ zy>QdE0NrC;6?}ygw&A%a!mO)mV2ec6bo>!DWo)WCv7gbmE)~@8xGSrd?pW&Lk190- zMw@OGtUh#201@X$nMSi-jnp;qIB98$YdlQi7QKm?oGMy|q(zv#hsvRp;Cf1fUgI=oG zQqgY_@ROnW{U(^cAAJPc+%6u+14e>&jltndnw2!oCWTU&==RgBiU_7d3iI1-!$xp8 zR-`+PV!3irr>4c}Wp6V zrc4kUU3a)B21PkkYNn7t$GSPx85V(hiqdF7i;9h6gQFcgiHNF0xF2O&Xbt}R25@T@XKhN-;_8j@&0 zNm*oyK`cyTk$oDGccXRmQXBC@-Gc`0aj zq_lY~*|Prti& znDHjmgxiagq*Tn#=IwJqBGqJ|OE$qdX3mC17}a!+H0VhN7OVxT`f3QH0F#ATPBj*; z6pap@JXAM)Mw@wu2K{Pn9v+=Ut}9b-X^Q8%m!A{{W3HHR=vW z==0FG?q2Fe_OTwO^^w3=m{3^TpE|zcXP#D-&C46rPz&{C;avwhtY~u$B#YkMMRi(D z7w7~J8i8wg(C8MF!Xk(UrSTO}L{Vx+GA#>mHPXUWwJt`ujU+J3jWZRUbRUI2HlB~D znG;&0WA={uHuJvTTYEcz179HH(thgo(oeM7AWNzOeJfu)fS4r=xp5WfA(ACOA*!fr}0_v@jWTx?l!>@T=@L>FytK z!MCMB&(4~ka{>~J>KSRuyxxrMl~=}!d_`uAShRgCGaTtA7~GNt^Ayv`tlTgZ2U!5Z z%#VSp;Y!l1j(>BPCO$kKoph0DRzfZ@2mb(zRkcGYEdKzO;c^3{kwhrDGijyd7Ji&l zhmVar^u8rATkcU===?kZO4qRm4i!}&mw~wl9$?YOw4q$!P4y4uOFDvEK*IO&u&1qM zM&2Vkr1q3Vk&@S2k;K*Z`$;Dy6lrc3<3!sy64{NB@E74u>s4SI9XKlr*0Zmre8fwX zHlx6{+q5Fs%Gb96l_%cWAa#-EeA!x{x9>^`0~m)tjtxhhd~n|h5VHD`5Z zoAV8xjZVf(lB9yaIuXkEwH%_BwyTb3oeo7?fHUJ=s>@;ymUVWO0EO7tn|PX*SVCM# zOrM6>RI-g$OOa3$6MhtT>jJGbgxOHcaKDkRW^0fMwOHEOTa`*DAGWiN;RRanMBmJy zNeH?4UWpntz&Vpd0YLlcyI6}ixJCmij!d4GT9nm2*vhSd6u$Li_U_r=q|ss<{b{!vmdL#gB_b~%Yg>S|Kl^?*m%1tXQa3JmX|=zN4qd+IcIpx!fC~eF z9~#u!M-Ok>yfB?}&2M^N55l!yahAVn(Q9j{g{)6jLmoRjC((7-6o6yOu=h)%c2R)6 z>v4@^Z@={i%D1!nn*RW3{^#jW#0nBBZ%~4)MS3R-AXA;Y{{T>b!%7Nsw}0vnk*VhY z0Q0wy`2M>2nl;tc)#n|+zi>qqbHVK(j1Q|p6(l|cXJ401%Ti=`x&({M5>e2p;z?qXnUK6R0|*=}coUBVKO#0e~KW+UlZ z3dtzR&(4POr8o+-9?lt%fv9P2RB-3%uNXHH5reSjjTSxB;}IhR=TrMly#{$wQ)YV8 zB%BRY$sx>|^U-%b>H*iRa%yfa?xfm5r2NGtv09^7B`vY5skzmIwJR3(Cbl`#D(Kl7 zSRO(N4NtskwiQw+qyWD8srSt;O;=SI27_XHJZu`Xbx{&lT#XoD(9{Yl!9{1T?Zsd9 zt;kl?&^m2YcLOs@HtI(3p))gPZ(CD9X=k=ntdidw-noMsg@N4I3((`-GXPnMH#I7Z z+$s3`an1fzZ__G_1vCrE2rPO<8*jCfb0&qsN2$3AVm+%$`WFGj@)fBJDGCHZU^DSF zYgv8(wd2f);z(i<#w@E@UDC3gbo7SB?VSR7C=aNvAfOz1GhN zn^Z>@g}o=sk*g-$+W}V_XXQbLO&z~;+D~O;?8*2aFN0-HX!%wV+A+*tiwry1{{XV= zqm}MHMz)}Z+}Ty4s#bD;x@pzYK+M{^-|hqO&}=HcDA!o9xvMyhtW;^|Si$?GxFxJJ zJOyU&H}k0}@0TMoxl+SyXkE`qEc<9hkg^D;{AZp4%0K_t_v zcLyVGf83Ha#8Cwt$-N@|-*)ErQShX5tEv-C#dbF)GydVaIg#?KF7jqJWd?u}j}n1) zISSlYU_0n{zJ&E9kA+R*Z%cd)0On0msKjh!L=rYETt6KLcE&8XzmEBbx@v zxmKpG4U_4RtJjYnH0H*06X-c`6pfxKG`3^pMKNoD>B73`)%%RwQme;f zagBFfy09ZFR%i^TrHJyU)!m_wS-WY*rtiYDSkQdl)>@Y-{Lx8RvstsQNIl|98v*=k zWOYGrtdEsYy6GAYCpuMrT7hHZSgwGKadjy+Y;DS@$fDYF8P)x^V`Uek9lT1TQ+06z zDmJ@XOY$jN*LV~wm4(lRN4;jVHJD|3dJ_~!SF3=%C%M|NW_838O}SI!hW%Q07bTir zl^_^hj=WC;LtxwiBL4siBy6DmXe_)fSC02AzMsQgZKYQ$>0bkem9xl_e^dC2$pK|H z01-i5xfrqd3VKr^xfZt-r6zk0Dn|=c@#L7fdt6Lmf7vg|~uO5Z6lmV3g^B}VR;^oKWgDN z;!|(Kzyd0}fY>hza3})8mEDxkKs^4 z*9sDDVvt~Lc^bZf4FX z>&23;ysCmrzim2W!^V@$lbJPgw+5+Qe%_R=eJft4o$s>bzC^73DSB5zx-q!;iYSDI z4ZzhhBb7Z7Qi^S1M=hO5;i9z2u!`d1s_LtU6HYJ((`-0W`-NpUBKPA-OUoYg;*UYu zww#V{j8qcpcTG&Hh5J% z!>E?KF~ykXO*Ls2Z9N}CMbu+zCRqv^;w~`oqN%@~TN}~UXxSXf9d7li(V+0KU;)64 z>zPRQiHCYi~B`e=apLei4}z z#C@xCEBlkTw|w}uN!7_kbe62edsHM+J_v-@p-$1ZjNaP3=;9dD1prkmQ7w?bkGAd` z76C;vov3|GPnB#eYE5WG+T)P}YsAy>LUU)HkGDd<_qX*kH*J-hVY_VK7hR=YU~ z8jHJ}lnSOK*j7(<-jsfClHkBOry3YCo2^xB9drK^p|u*#p?cD=;P zBxNdxEAgvOv-ZYRU=n5(p*1$>MK2=OgGd8hk~D9rej}Z8RShf+CW^@kj5;;J%@3(f zP{<7+30$zQX`b2EhHVB`TN&i!x>w^#8Xz{?pXzEI6pZXusurcH7MTe33WDaLL z^$KZ{>qJ+$l{2;%pgP&9ov^}^!_*-bYU$GI8u&yiy2CI6pem)+RtttPJ^z>aM^0BbM5EGVzle+^^xv*aynzr2^MvqpRtCGBv^IcI{qjJ{@Y}p%UK`KG9z>LAI<&h3J zBCZ1bDM+B(%kEuuh9>TL_)@1DZg07~t%L;5tE6B#@u*fBhM{qMs`JGX8$~C$Mg&{$ zsuHmawk&c2iCQVxB;h5s@KA6Ah@ej~KokqcMZ8522O{raPD(gc9YX>QGHpcakynDQ zt~9rCc2R4nu&W5jTdC@{RlzPyZ*jv)Q=-cm;V6H-}#8qZUSa5fJu!4b8G1J&|XkmJZW;6(~K~s=RKWgJVDMY<@ubUYy&9c#>8UkmjdD-wMlw#gPPFwkm4sq=R8_Golco&988Ls>e`Z$B!x!;Z_%-?`EO7ULvei zPnA?Z0O+h&SRE#=E^^C_3L@ax3yvd&9S2Q~>^O0$TCb+1RhG@cd~~U!?O>8yvSFr{ zk&7FQ1+W#P*}-Le>`f(`tt4&i6K}aHbhiu*I;^fQNH1;PyUOaeP)Sg8Zz_nVWI9d+ zU_qv(m9}8AXwfRBhSBn>q~MCSplO5#P}f?CRWwXcn^XxbY9uzGmaJjurx_YyWCpTT z>4@ecgc#8eRg~PJ_)_aIwOwQm2;woUWw`WUSWp^OD;}@kRTRG)UteBQiRZVDZHx?Ri zS+}vPq=Xu15@6g9dKB(7<4Gp!OIR8r2bA37TTsd=qfx3p+}fW=LW-v1NaI_aPXR?B zHe|Zk&|2i!VrcS`<(Y_8;>Q3hGkM&V0gG$uKB-Ut04)a63Qd&mTfb>e-Xr;~gp59s z%g(Y@Ek^dvXO1^DWlNkZK+_r^B@MEw6*Sof)-_EuVBCdt6He{+eK%~)5(t#F+l4-n z>LE~EoPezWY*1~`46A3f_5@W~IV~FwbYHzppl#Ge@HfI>BW(8?T=GGKYvc)&0 zK(c@Ub7HtrIfnY{Ik=Znc^-6{i`rccLp2oos0Eiy*3Q zh8Lo+(Gq!5v^7~QZYa@m<|%M*M~vBpY-`k?iLyUSKqOD7c^W>}OfAZ*fp%sQK6pz3BckF1~(4A zdC+4zU7&6luaz8_>yo@}v)T52!Ashf{cb&SSuwpz*%}>>h1?jSU-WMSk{u^qICBTvsmR<(ST*bz+SGB zv`lq%8)eF&qkSVk13@Uj^EJ?#hw4Ml222l_vt}0{NP1 zH1`Ukj87VlMO#X;p!I{sf z=C-WIxO2{um~l+1RHgmKXpVOHf1ybk-LE4SZf%WMjaY+iRZ;4$g%JqmZMQE`hMq^j z9V=^TTq~iLbdgpzELht?#2O~YY@3-I+&u^}0N9df@<;jzwZ#!)*Hbea>F~8e*T$dP zRZiWye9o#?w{vFVCCOoH zUyVpORYhHDh?_W5I}iOx@-($GvHt+nk0VQ${{YV4`mp2r>;C|irUyW>R`=;A(9;I7MaAI-4m17`qLxFm>TrJ^CYO8KCv9xr8in+O$l9t#HI|wg>+uUDYpUZT!lhWM=oYm=NfdPg1x>F?^%}YbhRYe|a;h!V z>IV@xP+im^%l#yi3t7l?~8!`(4d#z(_w{DGK z1&O!9o^9EUgCc@Pcdk6L?cvcKbWudUX4tIW>$C)ZrZJEDfPWfU`^MndX$w*Q=eclk zQVs+WNmXjOU(yRwpaK#ot0@#Tc;6$BD!5DKU0jhU3MU+DOv^#`%|TKq$ROz?y$G6< zRiXlQRn_QV8Z;YuCy+-PmUhWS6Bk0vY%6QGcA{-I;@}*UiSwiEdrVtJ67C9@7=TYo z{PU*H_ht=_;yeEUh*t9i_6h>13ZlSd1#vVr-0h#yDmRk~=5cF+50wc76x_?Dbd1d> zQ!5h0njPs_$S7)^R3K_^Q-Y|ou(c~C%@vx2#`M)fS%4zADd9vctBJS9m7BTkq9+|k zlGRZrhS3|HJGYnHQVn^jd)(&;P%n#OX<0X0&BhYS#2y0y_EwOpv(;{U&e9AXRR{2l zPuW=euiP5R8+eN!#`%1!G;H76_dvP~4?3ugxmtwI%x*Ec)9yEWuBn`rz5rmO;Z!$l zTM{s%EN$r~%5fvcrFPFF1c^(z$y8j>43xgGJSy?oF|9qH?QQ&rR^gTeJUvhH%C;cv z9l8q_R+)zvIDCaVLN<>rrKL7dSn>k&%sr!fCL$sSGlhEi;)Wq;kx+6_1xYo5C!LG1 z?k(0;e%dMQx<&o+r}{-~yNUyn*-&9pVa>GP!~X!M-aZ@+Auj&_yuxhThaPsXP5NeY zja_?e4lN>v^Q;zm6W%+p{{ZqEY2V46}c~BiFnedwZ<4JZ6lp$rmV@PV?Vnm_Z^$enhcRxUbLry zV{)o>0g<4*cT++}Gf1itM|HId*ENE2j0*D?s$Po1!sCSr@HZJ8MQAc-R9d>MqOeNV ziyb?4Jix5x7N@rdPTC>N58*@%9Q{E@;viA?y(JTp(4k*~AicKdfw(Up@GUmDY zP~7VP{YyrS`;inpMOLm;Um|u;=jK-8L<}lb^$jd>{xrN#py@e%^k!S)C|b42SYfTL zj?#@CuE}LVB#+WK49A@+<~U^_T1eL5lS4@ujW-~i>~pD(G-TH?vYrDoUS;vTc53al z(Dbn1?j-B+U4luo4W>v%uZdm<%BDmyZIjiQXmZ zllYHnR%2#o*;TEq9Y;PN8mx%tQ6~C%{nTkA5fc$NLx?83ZwJ3BMU9j{}t@G7?UXIFVAMrqe4Dv?&OX z#@#(5jUFJ^0SVM{wJwH67B?VajX4+xPqsA3F(e*bXxmQOnSMZ}Q*szsjQQ4cungQy z?d4jMKC70+&F6B7JbU@Mz-JH_m?mP_1& z;Y-|9gF}Mr>T9dqZ@Fz!d{fdE#j1EzDFJ~wRMVnt;a6IvT@5-FlTG&2GH+vy8yC0- zmK3KN)a($K-8}yQObefjU@3Dr#drSK_?o{`j^>y9RQ~{sS5w~b=UrY**y{V2?s*2y zJjEMv{lh?SQhAC#33B83%ye4-OR!(V4E}Qepah}FeY!J(sx>nZ5qXo9 zdWnB*Z6(>owvEJH$~C)7^vK5&t@l=c?M<+K#GA@^;CrKlbw< zv0wSt)1X$H{LCQg+2Cpm78bphi@DhD_RVd?EShpQy8Olz6=XLD4;mbrP=?~0m(V0n z?VVP+;Y=jpw_Zk+w#$*G9v~N5!h}OnVFG= z+^$4ki~_jIlXgHs8H~W8yzb)Hvhoz^TG1MLis5*SP3=4#*Xr)sSaY*4qs_bx8(f2436sZG?UPq4pMG9M4aK}gBVD$RvgxoLMh zox^ILR*{buB-JRM*cIAn3<~6AZC731=08M?J|>}%)pTC5hNJIW*zhh~c;io}?g$2* zYF_@U4JA*<16c{SX&TCB>l3$bq}_z-GnF8OT;{oNq4&>#imo>xc>kOMt<&?h$AQZn-8*z-Lpsfbzjpc z`fW^*t)nt+#^z(zO}PvO14CBd>4tWwZL%B)qX3j*>7pPNp#8lLM%7RD`36=rVA2Iy z)k=auIf}Biv#U1VRLy=hT_%Js!I{!RF-1con<9&oN*?XKMJu#FrHtlR*4}Mb++6L7 z@?cMuCP1|i9No*fgMZb{fAN~Uf4Do;C!==kIX#$tw4{rT35972NZ;H3_1{Nfx`8HM zEQdpV;1QDa`cKyx{{SibtI_uV0NuM8?H>4kierYnS_VJj&3-g=V!21CQYe6mMP#~%Rt$}b zx|^vU1W^`ZGot{Jy;KR!NRTkXhbv)O3dJTho4Q+rS`wN@e5l9_iN-WI%7l|pxgx{D zi@C5Tp9)z|OLMFpqg&C3sHN8D?#y*i$+9timqmm2!YO^=FJ23Je3IXaLXu>fp=YZ0_ zbZ8@3V>`L?K9R)KZD3Z9-Iu3r4kZ32rMFwA+{vpb*92Zdn_+h=B&{o#Y|jo2Er%?lGyp9wM5$8R`mUw4`u2io8$spM`ej-4D;C)G}%F6jO@| z)YnjiV^(HBJ;xZRwW^BO7}c|(mlbkW9*?6A9M;8YU36)bGV37QKp8JOB)Z{LW?K?2 zKb2ZGjxbn&WKqxv!ig)U;yWs5()67qrsfbEf_kwMx($AnOU@*9}`tqbbV1>7;&r1JhBhWY&qK1J10HM z<4MvOU6kCl0N z?X62LwFDBmY5?V4vv1xzZt=pF_9e(h_zxvvg>rk>ehDhKS(`QCu=t{P*Pw50e+_jp z?I$tM)H3H?UT56!W#I7*>Q6C8+<$b?Uo`WhZa=td-Oai=ux!QR+Aj0BBrZsdF1an9 zk-&M=UCX=vmA^%?RZnXNU^-C#6(7XaHWS4MaW5+bQxO51E8d&;J1BOT7(K?hX0^#D zom&$B0E^PqTiu+V;@|VWRJH3>qFYaihJRJM_ct;VD2m$HoUfIIa_P76t$F3`soUpG zqecS^RSqSN6^tn^xHYdP)Uw#E&0EvKRl-{qH8m9?qRXO1T>-Jf0h#4hCcv8Xy{}^o zU8x4?2^-^gHuR69%B7P05^*xes*}%L>C?buE16UahQB)3?mdQB6{g!ay%LQ~roq*D z_|{mBT*ixum4Nx1P_3%R`yOg%vENg4=?)ro5<^r&7YG+(zisdCQEs{?w!`yRnD z>hry6$l*onCwsmk;2I4hCcy3@*lop>7H$_cog)@Ht))&@78MgrU9Q#B?wfE_H$ot? zsK{2WVXZva+pSn5TpvyB1`y**(e&IOHAsS)_{6>-A_ZHkB+HHY{V4j%AszdnXJV~V3CILo}1*mcgtgT#l z8wdA%kPSN?-wXqRVp+b+Qu2QB@6D6Mo&i6dWisJZ(@n@%RBHbK`m6T^u6GILpjFfN zk9$vFwIK0Ze+tL9I-}a=!oz^ACWLxOzk9L6b+jHW8(-`+^gp%+s#dT4$b?EXWaDY5vGPrL>xtSigchj5mYepqA00OVut%@+c8cU$l+BfSO!+-WKPpr}aM}B8WI@v0IZ$Y1%tupt8zvOfjA(2ypgf6{p}jKeK#))x zK~-L_Lz0LB?K_VD0Jj}m4Z}lx)RlF`T~3w4%etM^>dTW{S-njDvO z2j)lr0NexAJaeKesp=(s38bZK(PeN#uwcmJQaYQfDafg%C2#>Xg%I91RjF&(9~!*R zt;wn_t}lqbB7-SZFS|V=mK5i3&_Hw=LmU^CCtAA(+mk|&QEHAag%AwD4uw7yGi6s% zWdo3^$fc|)x(n2-Uz4|K4rd>pRUN-%`?(n3L@^C>%zY@dQMI3YJX;;O>wH+8kw$FZ z0XpJ9+;Av4H+$ymvB;-2VViAwVEE+qImCpc*!jVH)vo>S|W4PysXwb-4JYA8Q>FYH1M#Gi=_@ZIN5su<^Bc&~6wuBh z{OVBE6C}`50}CI4p|d<|q#Sdi16=9uExw_b@~P&>&boa|@hO8R3;Mp7r;w4kH#n14 zkRNZxtWeulSlZPLZAl*OJs)_B420h9nF4P@fa13l2Q0$jFLX_Iv%5 z>5{c%)7^H*+ibs3&-v!e(TtT3-&qCOn&j4;{p)io2Y8p;aAUFhg{)0wq82_>nBBE^ zjmES>RbyLnNARYALN07MlS@QD<3uA+Hppj7eQnsKbf~Xzn6X&b&_3EmL!}L~BAVTg z%u(S=$_N)U_0b}B-Hh-1dqWHxxQ4B?ktU~HLcOuSogy49&Igs~`)=X8+Jdl2WIm|K z42S%tiyw0V!#>UjH{iBE%CdG!BbUYnh2$Zruc+J;k**304M$3o)Y;f`rni5oo!@mN zOcwUOn<{~jrAa29u2<{^TckTGHnaz&h_%N%RNkmCH>(UyFasu3MaqV>MarEB%c->= zYzMxV9Owf&KG*x{=UV>&MZfi6uh(BRXlPzl)oSYVj`J=3N#{n~e{j&zX1L#5O7U6orfx^!TKTE0mYmUNbVtJgX3&3V*U~%P*Eh|)- zPDWN%)gGU8OU~yqO;rIS94a+kugn8i29YD9lSnEPg%oMj7>kjW1zN5ei~%-l?R}CTgCz}>ObYi@IT#@{A4rCW`% zGuYmsRfw(&RYFN+ThUc3qgzpcqAMURbc=Y+Tne)-(W_fyS8)?jRwAO*1}MhDgz}Yz zqZoUHYViYw6~+{_nbNV4D^yyqYKu@985LbLQYtM)3c(RUmY8#4Nyzs!!h$9Zl7N$bu{7Rjt^6aL?Ks*pwOjYa6^H)e$+oUwYF>j=hhdVO&&lp+mTecw^jc z8l#nRBkn#FP{7s{8zP!scmttR#+hoXWkAQ1-N0gysij*g-|o9$>#Ph#VMwG_ z9Sb!AT7kby7SCFCBTLJDxO0C&^>Mci&I+Sw8 ziGmuHQb@45H~=#yr%5z#bZjE`bKN-nl|MlIXYQjQ*p1xZpxeI26aN5rxgYnkkEJ+3 zr~d#oW>^7XTuCIcH)3u{%#&OJGz@T3Md_`qY8X3>KpW{iXegI7!08qg9=ZiMY4!^= zsW#xcAdOB+I8~KPkgJ)XE)@mM>tn*FBUFW1n@WPj08wB(Dd_uL&cw{ZFn9r}zRCx2+6|njv9mN%Ex}=9 zsAo`4ytLhp?wg4L?>UFq!$3C}V^FW8^Qz>0>wq-Sf;kP?Ux}s)HLYww#?-FZkhI35 z&l-i>Qu`egT%mUo-NeE~AQCN!q~;?{Yb3?BgOZyA&aoyY?dE9WyR&Ji;{eT#Q6`-7 zpTHgKmC8E0=A;qkD0iu=5F4MlZl^;Vy^)RB3@_(P8-s2&ZM2X==y9eFls*A7Xxfl7=imh2{ry(YyxYSaykoRx&x$&nW zGK=aa#`ZW|a;&I#Z2&41HO=m5gSu`q0YysHZL)5bc5V@&xn>&~HRpzToNF~C1#EMv zlYKnVn4a2C5HZ4mLaHW8(yb<+bJN7(;)%vggZNP|S-qxhdrxfoq9hL^jXte<8#3!u z7&TZm2vw+nC~DH!?}m{Shc8L2o7IC6L7<+5$S7>pmk#mJSmG&xx<=z_MQ2S`e9eSTYEpb#WLEG+NnG$H^4+MhiBJmY>Wz<3&uLDALh!z2E2BbCT z_mOEPy#t$y$lfR~Z;cS69oEzb6z1#z!jxfHU=lDyB+?ATo6+|&Yi%PX{xkzb2XLsX z0Z>I_91U1iMG;07j7S%%kPX4a8Y&FxgkxC7uF`Wp-ZYaLAsPd5WFC-z!<96PVSZJe zvjuH$I?&!uk?o7F7-i#1!evVO_bhk}D1cuI1OStBo@Sdxu<@n=0YEpSMz$J{8t9@j zHMk5-5@twnUZ(NLP?azk(oQn0BU=l%(1(wS@T6pSmCL!*&6%sQXKS2E<5IDKiOz@t z1mbG;z7>5Wn*l{lxlyUB0IX?YRwA!!RT$ct8I)scpg7bsT-OR^xQw|qQHic5x-4V@ zje$|&(;W=4In|_V04PM<)?r11T8Nm64d}5PD=p0S2|%25lSZmKhE@dI0%@3Qu~^-Z ztD&Ttl3iZp57JvU zLxt(1+~C_pAz;!>xD*2ma3zf)xbAzMz-4VI6JelZ^CrBy*6Y*8INNg6PE(JFn6?+I z1~#`0>Zd9sF&QsxEmdw5vguBN_QMQvqmX`+j|!&RDJ(!2H=|3i+*mlUHo-~8x$-r$ zaVJ(C8ga0=Q5uB3&Nn>oSknDfu;(Ci8JftHdaHYV?L9;8wx@)P*9wDNE1=~X*njFT z$QpmS5;jrX-&6kp0ZD8H*^M#W*n3bX99WM$E2g@8cKg_i{{Zz~2tuqXhMw*HvvI$i zMHi%4yq`*s8j97x)@df*i4n8f?l&%01TIuu+l4T88_2aUtLE2=B2%sa&z0jM2bIaM7-tLMsyXG`^TlYpwt(riXG(`TAu(0MO|v3RhFo8oN6jf zL8W6Nu5qXp&7DOf85XMpRjDGz)CM$m5{Ok;`dE|a7z0Ig?D_b*q8U_s`D)XrK7oB7@)9_>89IdL3E-C%QBQ+MJ*jktdbc0KHRc}U}Y;VBQ z#M*=nGF!&i0+ifIz){*#pnz?9Mn<`#skAAbSw=MiuA>?voaYJ{qCO_oQUIV5V~ESB z0s#Wz{A!wPam-h0Alw@ogIXN#pk+qdoK5SpsLr69n^6H_P;;vRVNqECbGG+g*KKp{ zb;8E)1A0%2@-^!A9ouQYQS7#vIKXb&9D`ryI=_?m0?XM zyCEYXfUJh-Qmt!%Iagw8z)=AOZG}{dB}JKkOt+%GAQP zBOci!Tc3%bJ8En);YHj^Wo;|y9C^_6SXPrjGfPU?*iq$hFr`Vkq5?0%q*MyxZBJ2b zRgDvE{mb&87RHSMuqT~n!jQy`b5*@o_pZHT7QGrTO)gC|g32hZ%=RRjgNQX(YUMW+ z)2KQEgxcb+XiL)}^P?Ko1(DGl=(H3ze*;A{=$kHw8Zf27#*U{7r5P)sZTxn8d zsUwN4Sw-V-3~33KK)4y@T)yMelWi}r#OwC!o+js9dVD$nHF#tw))_W+LNNm`8nuu& zK`c4c+&ueGX-WetGMuk|G@I?6 z&mhMhcC88(fF_wPI~vz_g!%~XlW!b46b*O7og^yqD@SIZ4gfK+0LNuuRPmKe*$K3a-Hv4@m zw?3nLG4rSUUv9G;t>AHA+>|`TsltZ)4eUnG3y+0HZ9b%R)9ob~?N{W%mTOp?I8ip=-%mOd2N*CS+{F`Z{q*yp zf2Psdl&1Bb=BM+nuKsn^<{jpAo}?Zkjk^Bn@)QU4r=1^j{n9+E(arTQBZm&c6C*U( z4i!TQy@AU*X|tdqxN=X`jZYKjZv=~Gs--7;S^R-}XH~E9s|d(!4aKuHaHCD{iLL_2 zJKu$La9zI>o16ZSCR4*2jWklcXk(R2C19l-gJF$DS@X9ltw^dn%A{8c>cJd``z!IL zU@7f-e=`2N@TFn?(54~4P%y~E6U#b^nB`?gj9W__dErn&6q?KY2Oyf1Vgc|s_*WIR zylMt_toD_t$$Fvb%TJkbZrBohd@7}C7)bI6*5O7j^vru%Hx1CIPZLWmwW3;d9pYH( z)bf0~>GBs)4jMIcy>Wwx7Oi-@V}a?gq8{AV%AA&l8B0|Nt$DT#1?@;p0ZtSGgxadE z=yf3~M-fDELNo$t?K{1!n~XU>4~=O1fyLC^8uKQNw%$v&Jv~Xq58Xr!8~WK;IvX;Z zsqqx^I<}dU1ej{KCi<7)YbG7cdx*r5n~aF!4+y_o#D?R2nd82n}5*SF47w ztioCBG_}Fiz-Bz?Ow|o@jZ(&z0!ez64EbfwuN)&c$B?O!^x!k10Bmi5sX>kE6$=}h zDvKJ%A-Pq21zo7n?cG&ob?I+GtP`P&K)LlAxixFmbF2bN>J_WD+_vHn&TlI8$a#^+ z<5^;v*^;dMi2fCT!1sCdff}Bs{uP$1MBL5q?p{x%8!wQk6vzasgI2Xbt5z`BfKkp2k8|l6RHABa zB8waj=SUwa*V%SSSO#?}ypCp-v4o)8vj7x)X`!_WF~ru?U9P|nNbsg3?eL~LZh4y8 zfwKWN6U=%R!u<7$ER~U&S8JNQXQqLB(NNiGmf(8>klI5=TtzJBtkL2(S~Yrt+Z-@r zJ|d1W6c+UgD&!#-6SimRbgHN%E}YWo<5XFAG!ddJmOm9PLy0 zDqVb-{@KE}nky~>s~M}zr%yX)Lyn-fEv$|}b2NQ77octLObt15&ZBM1(Jm;alb-=d zyt8VWNMmVZj9x;b;Q-=IZF@Uq+Xhjzhw%HMuYO@skydz3`!N( z05CMvY%hVom3goT#)z^=rs~9b8tcdI-BMgrg$FhLva@fN=dFe9PQt+PuNIr_*tZK3QVmsz< zd)9v2{{T@Rol7UvZzI3k)zwu!=k+yzoppEfuCFlkjOX>Iof~ug=Agf=Jm}l605d_% zzV5fey&T)GiN%Xyb~F}DNgQ~1)unKfmElzmyz8BEqm*^}GF2-TUA%{tsfadllljEA zfWoS>pv{FICs#HEA1X|la>s8X_q;5kB5i9qxw|Jk-!>?flR@YZ$vq zhXxq|#2Q4^X=_@E+GoV%%}UcHl^SY#ennV={w^k~Qgg1X#YYP2>Y4!>i~C}a7F4`m zflR||Vk-nP)rmY!Rcgd#N)w9`F{`9(SSS}KATc=Aq1(&4m_rKdcHlpWuUp!CEISnr z_I<(4xG#dx@Ih~@5$&J1ZUo!WVVc4}`Kxs{@SqB)02u%%wyw1@LOV7BNY>d>tOqJ} z#p!91!t_9drVC?*W=|S1HyBgX$w1wnQ>3fP`7>Ur>@_U)G1 zL~gIl$$`vyRPSyIN>@`Q_9NKU6MK@O{M8?Kl_y%8q)y+vyl-*`q-W%7K4y23q;(2h z-opVy8*jxuQ!_;(noYc(qEVmF5!0 zo0Y&xgN{x!r8iP^;X&>Dg_B;~oFx}Q$=CVNrF-2;wP_VsQCS-1l-wLChB(rjrm(d# zFsmGDE2?RLb?VEduqM?*RVIK&3JYOeh%b5)N^&%CaG+zEtT4`m7UvqdsRD_PwS}vN zajsBU*iZ>*(_3Td6xKEafXGxLg%+#YunLu`+SE%_=q-@FV*?dwpV-;R;|6|(^EG9K zwE#sc-6Rb%?bp)~yMKuP04l~4MX;g)Pz6{DVM!G=)zyqnb--SwMl|lvw{ABMG%2^0 z0}7%OfEP5(doq1_{t;e_XZv=*8G1({oons;cGqv{jB5Nx6GM^&KO@fVHl5VMAls>m z9(K}A`JCzfx9!1wTbI;$f&A-q04uHq2HOfr0NeKMuH1fHU>zlP3GcF)S*^MEpVd104ynSQfdV-%S{W6s%i#RHIa^~uD2TM zWCjv5)kPE-{Zvs;U4&)myKntOesnT45&^#>SKEK;BmV#u3%RTEX0GeZ*8X+X-~Rv= zb$O?0oZhtaqwdHv8w+LpC=KgRIyUS3#=RWduZhQtW@k_R+5>ux9)Ipq?VSWOBvr-6 zBM&Ma=#_w7f(Ba~sTV$V%)lG~s^@C%6s-)HME0fVVWE$uhd&w%DOM`kgJV(#BGocB zxeIfpYfz%K)zxAaz=LzdP#FwDe<%;On1>-t!{`*mUYf=X2P$V}vD|N`5I`<|w)#|a zHC>+6&aEtxF5hbx_xCU9LCAAsz)|J>%G+pvN!X(OJU>?MVX9dV;t7!W{HR2RPgS(o z>^nB!RF0AUIiw+Oel(`%_kU!Bm5JYS!~T-={{YO^72&3mZOoqT>Q~%Kez{n;$Yeeh zQAQ(RMDBXYe|+2fJ0osx{{YH`{{ZW)&GFhLzr<_I6Hsdg5$eqe)RkIfI zDc0kp@dt%01Ti$E@=v#u+<~-~1QX{>lS7aP7BnoAP{vLej7S(4Csdcl`PFv>TSjf4 zm08fEToO4ELMzIVS6Lms0a~~Uu@%;;2tt>Q!=bY&1RoJh?xhkDD8pE}9z1D#R5Mv^ z@~j3yG>+-6_T^18SQAJ)YGP@S2o=>@urxq*RMeWOtYRq9%YK%?@H8P%MPm(Bg)EYl z!LeWAOachF#2N-T(VG+j+0r@4JkED*I7=Qa1tRUf;I%jh}3b zL@Rj@u156}NZ(-jqZhUQ)DeLu@711~^bu`ffpo^9K%%oynXkr%tOT>7(9FYyPL(w} zSCtqvlrkEovqdU7P}Hg%YON)>RaxbiSt=w2;BcndMc zicsJ`}=$+wG;Dtb-0Gg>3D15pBR@)h9E< z%8wLj66sND9_Mu&33fP~hZ8{3Q+2pl(A?G*=Wx!}2Rgp%a`Q1}IB*=PFm*NQk%F%( zIxVrG#=L04iZEdtdp`BXomy>vtNB$9Myd@<9+OOkv;v~UEN?=h#X)Wtux?aCl?Y}i zrz2EEpF))!YlTBm11iK^6Of^?4SrQ;I8;S!NvP$72B1~2 zws`WYig62!sLKH(Q8pA2m0MF<*Ta<)O6sKJ;gxp^ik=iujI?;Tqj8`os*EYnthE5->R$XKn)k39!B=!hs7D0;$MlMvu{Mcc2n?Q^~j}ho^5B_Fx{B=Es|! zCWEH0YL$)N`bF)DrI;C@R;aaHii=YM3L1-5$j2Jy08o<@wW=6iq?+I>7>LjlbHbQb zDsC_|5rq&nV2;DPBc-zC{HcK=wnnopdXcDN4Fehsp|hb$9BQ{*4-r94#KR9z=|)2KIys5Nl4#b|-F+l3wgtE$9R4PZ%Y zR1r~nur-2G)ns!S=DbC570RWUD9oEyF{8Fija>4kfU3lnPzFM}S>c3!V*q(^rI3UI zt0eJ4F6SN!F*KB$=_JA-p?RF>Hpb@?b0&nE0`51{$_l6DMtBcV^E9%k8CCSxTA2#S z(^nWRR8!jxs>yxC{{Y!fO8z$fRhxw%N=of}d(NU+PqhaF^*4~Gll0qRXd?jebBiC1 z4sF9o*WtiWOJ0&&-{d+;8c=t=-qzw4(hg%WPec2=aJCb~vJNGBO?mxR2P|;LhDoCU zXSRdAZFh)T79oeKHo=8eyMkW>dhxM5kw~&ebh_dQt!Q^~P6IrGBmST~4}}q0H&cAB zY%h9YWMV4}cdpg77L8tJ;@J%a_RG zT>E&ZI>7eN)CNYX1~}0@#ZhWl)<)-~6!w-e(mqtC;kQk7NXoB1CY&?cqxD0TQ4(fP z>31am0Bq5s?bA1`Tf($|QaMzK!OogRD+a_Sb{XVlN=UCHB^08+(CyiB@oak~kmA@VoV8G>Tog?E`i7JSso1D!uqQZ%b z3bj`CH>NRb*D=DYdW+*kR*s`40)(RGj4LBOi(e5$W7A6)>++)$g))1H*2fBm%A{3f z%9(5jxF$GPN7TL|s^SO>wHh zjAV>!Lua*yP#ids#wI+he)^5nC!5HT>(%(Dk!5JR^d@y!ip7=o~kf31ocx}FpaoS;_Hqc zG|t>=?b%3aM|_o{an8!J{7H=-Lu68Ei1zYDB1qP-VR23pp-zhe1_F>0ySkS*#9_jr zOt;H16{_F9r*F9S*nPDUv%XB1o-Jur2F{=S)zxo@jdgKD1g^}#B<$cVf~epqbrm!rEf8hBStZzwB;imh4Ok2_pu&i;&e#miK+dM;5qu6}qm2NM zz{p`xz~RJaS4(NasT^fsMC_2RM_KuL9PP2)ir{3sF6g@a1~TtOc$B0IMOs4R+iR*>sbbyJ18eJS6#9$ zV)S$%u9AGKug;|{?otxis1e6)Lf6W|xse>|u?jfzt$x?pBi}*q?j4ppkbx`-wr1w_ z9pkgM$^karjF71UK;EU~aN$g;qH(M7Ci1mtPj3SUdl7~)AUcqnUy7d^Pu?6&YY?(T zV|-FUW8vdilR)su(MjqYcoD#gY;Sct8t!7vZ`eBTk}I2PYhVQ-ERQRfe9sP4O%+15 zND@I>q%B-65o6+Lz#9Y>xUC$h;Z$LT5k**IR3eJm)d;K<4y-D4*IIy1tH4!eQrQZn ztEdEGee{Q>Bc*xqrEwZQyOhq9wxkvvN_Hr?)dLgfU?pcmYtO^m{-uo^Toe0HknQQ&r7v-1Y{@ zE~<;w0lBqEBJ@DnY)wv^RG{NlVl74lc5+hmH*hnm%`i*`CX{DpHzu?U8K)dEp)|~R z)d{swo6$(pNn&a$Dn$?%iJln*u)9Sl#5`oHe8p~T{{V8xZ69(P#zS&~%s=~zFg{|i ztE(9HdeziAFmz#cWyBHTLt|cVVcccdwTE8ajovO_)SQia6qY&SSz&E)z95R7lnqxU zNT||k)n&F+6AMDpDYg^?deC^TFr}Uw8ev7vMX3JWRHdkx7!_?m3~C&O7}C;6Tgr++ zW#yc=O5i92*ArDVz&M%_X+ z=T9+K*pVy{QrPemWJzTFxKW+XYNGWANI(T>b{WcUrHC7Q(bymATt#wby_GF=rPo+G zG1W?4%0c^oxJit zb^Pm2^_jW;<9XLjDyyPUiC<6^D^MugO{|-#L}`B#F+U1s(o)1py%Bw`+Fi?t*UD8Ytc-h#Q&1ygkb%S|=9)X)>$Y6k;Dz&K%*?nNw)%a&ZK z;mONBRnNlM+jZHU_V*a`(N`vxU!Q@$`j|f$%j~YKKE74e54O9Nii{sxe~3}HBni#M zz_t_<>W}J-gvm)3_3duPTFJKki#%k8&+$_?aI*;eGFGuI~!iT z2G?=3_gXW{hBmucCfkWMvM9JgfuSn&AL%)9K2*}EjsT02icPp0O6xj} z*!112_RM>YynDUOp)0W^A)@MOJ>ixlX%0TCD4bPw=W?_N!SfI)t-lW+V&gh#CwQUfEH2)mS6CZUJrTO zqK9`h5lC5Mc2#Wd1$z(NJ;(H$Lkw+g#N$faHBYI&>hdXjh{gk*Yd*opUaw=*{?UX* z+hno1X^qd4sI2ea!dKjFf{UU?%s|fU*302rU$C9s?%+TDGyedX z)|bXWl6PqG0~(rkUAn$D(%i@2LH#78*jV3<=qs-w-5;4dDD};Al8c(rR8Yhpg$rx9 zF(rpnHYAGH?fsK;y+J!Th9XD=i?OyC3Y(i-LDW{WZ4BhmsO!sxPvz>h`gj`ju>RZa z>5Q7@Kh$)OlGAJ3yJp;B1V}ls2mb&yH`;wzpLKLnV}9Q544aS9J_#>iP~)CRqAXuFt&OrjY~tspxGd{!`&zqyGTZ9k>3YTl@yE7kb!A+ELp6Drq9A&oYkI zYB(MpKW=xqGTFNS0EN%PLDo~GB9u-sJQf_fL*H$rF>s*1%+NO)O zkKEnEA2tN}3}^)!jDY}NKnetu#LahO<4VYBSwscun|Q>VxX|LD>Te~+tj4Xf^~)#W zT_fXJ0fya7WtEumpaW3tb5#bJEeWuiszITHRun+Ps~cZ{p-ncCVVzZK4p zjB?&a)N-Q%P@n-}R-$5R3jsrUm2eoE36QpQKoz8_Y9^_AveqzFrW9CEV;pF=qGnjN zg(}T*O&UhRm%U*^A;y_Qg(jrj0g0!hg@S_Ecu?f4xOlg)MN@4@1?Fm{uZ60|8v<=Z zabsX^InrArwwoc967gqRjkJ_)_c2V^DmB=STxzLpH6}awUX`TNPpW{e9Il3xz4|n` z+QiNMZgh{9bd=rKxJWUOMh^(ZzSE5;;Hj~wcD;uIQ?IwhU8_ENj`CUc`38zd1>L&Y zuqClI#1_a^BJ`TDVy5Dm@1PdN39RkU_Zqac>Nc$TmOp%nNm%Y~!!gLyC%7%JylNgq zLdzI-3S@6e--)kT9^Yl!V-dT6_5_^XPw)@JUPxOJn9BU?M`yi>kv3cQ{Ds4Bxy|$RP*C^OIO8xRj%yV?5jF1PiDs_o_+4%1yamHQ7Bcv5}hStQ*nFd`)ug?znObFN!on^>#p#+Uy9WLmW2 z>wc@hz-}$n9l{f^?m-(G=E-?eRrao?`3 z#Dd#sKB9a%c$)LO&EDsGJ8pL^cWeTWN-qUp3b(XYSF^AG0H0pmzuWqY?j2z#t-ntZ zah(%|3}-|DyQ(f^*jIe$azwP3QbA2Es^##}Y`kw$4Rnz*5*TH~Wl)0b2Ra%(Leowf zh8Nv_d@HK!SzS}Aw=C{Dfm#y1(g01dYNC`a@Mu!vRO8uo;tO- zmgoDF3O?)mzY1TC6|ytkomX0=T|qfk09aHR;skwb{A+u4`Us`a`#~cSsFhKbVeN~O_}8JIXC%`5sV0M`O|5$7%-1^dZ7wfj_>NPSpEmWxC;_Fk0X8i&FjfVZYxPlWTDrgRieb zl6W%ltkwOgzGdr{HE%M1fU7q8AyQ9USVOw+lY87BaF;P)v4+6u1DBm8udh`z+&gaP zw@M@20cOP=aaQuBIDZO9zNJ(~hq&w}{jL%?>i+=DYb*Ct57a`ZF&)RnjcNYgzxzJk z{{Yqh0GQS%?xw$TMdcFxrKzp-{E64=e-kYTwlsL4LUohy6bQ(*xluz}xvbo{(CnpD zA%`m(5-{aj9jm{l+5xxSg36!Tbr&}LCo0LAwFMkAp=rYR_))~&b?z=yt)u8|Z$ENw zT3~xQYuS)&6 z{gfa7094&IF5Bk+0RI3jJW+L#TgduAVf$(U8DD+NA4wosd@CHsF3WP!KdDFzKHAcU z_ds$(?eQOl`20m?O)1@OB-~AdF}{(&423365uo__%j9V*E3KT~GtRTO2@a+~XN>S8 z3K*3iq`sBlD$ElCjtJxBP*sP!DuiV1aWh^Q_QCp2BjG}R)43TkADFEfUv8ur+W2)3 z8WV0cVS5U-a^zipVmx$xAkRIscgcQrAMIO$ab;6lBXr6^)p961&HG0K$$q?-%+dR~ z8;t?>=(RC-@xufAD8^Yw_Z;Luq*A(SaV$y1oJsMnHFcsQ+_DI@R;1MFxWhWeD_vbu z1!0c0H`mz3oa8+o=At!Vc2(X)9@a<(2r3I;`_InvH((i&OKDMSs;PR;se9BvH? zR>Grh+8@D%jTE#N%rjL1s~V>oVFC)VHWff>8LI%Rwar$f)PY#VSlCeNWNVvps*Gr( z76SEfwF1JpwPO~*R2HgSnv+-r6ICXp)k&ga398o`>c$DTnYR0gr(Ds6{Eh@ys+M$2 zdF5VGD4J3ob1`@=hTV3Noaq3f;s#!LrZb>+7YjLrQ+d2)I zMhwR@$ks_Gj|y^a%gLF;l`Oy$OIFt9BSP?tp*$~ERRyeYsv#;c#BmjMU`^{i*jB|F zv-dyTYJB63A-MkIQ&d}QE-FFBy0~XdA*Zt6tZ^>SbjS49yfX}2ZrsQ8^A)xvO^hSC zcSc#I{{TT39cP0NKeD{STniC}Ro&lCwqu}aK*su4kf`ML>d!~TH|memw3Mc2RP>&~ zH@n@={{VD%Ta$J;A`eP0;aU+l7O3N0SFKf2NkUr^ZMQF}7=wm8F4~0%zf9$^jwA?IF7@2iRb7i)7rP>)Gku~PR_T@}3y&a0_ zc2Q#4niRg_mNPG@j|{C*qxCqCRL-YvY=7|bw9O$=Mu|^X)s@nI%hy(ivkxlj-*D#p zVzt%ANP)IBcS5Ge&YM-bfpqBPLv#JpS})ERBq8Ra0ybSN#Jz> zg?Oz)BVMofq{1%Cr&g0BsG#{>zUuH^;~({JTa8}wWbBrQ(tmE7_IfiZ}Q%>C!^TO+GTDoHxVukdyMM; z0IY{BZO*cbN%XiU#;mU>&q=A<4PLsHu4|)CP1G+DTaZR03QX>Q5F^Hg@5n#X2guic zpz(;-t~Ff^Y>vSW=EC@}@TR+D8@}s5>Gp_jqVhW%A`j{`kG{WvkA*qgd*17|$X{&O zHND8#U0&Sj86}xvBjWW9l@#ka)2&pwxSBi2~qfYJFgZF}3{a z;zdzlC_8pRNXoN02)MJ5tLAHFWmr)*>y&B%^Qvuj(FxmlMV2wryfvORNnEic=4iK| zYPAC^QtW7w9B2+{M+VrMgI2w&4mCtc?q5~K{&g3ssjwu~)Ni;xMn&ER*t0=5uYmHjg7c@3Etc*dbnwqq6 z>w6rACWrxrW<4OEDm;4~%$SfOPA>ld%Q`QHK!3aQ=_Z20(!+L&TAiUcvka$DCS z^*8brVM~q7R=xfeR^6PCd}zQ1i(5JqN~4V^(z|AAE^8QI$_+?hXegx7ZDCprTJ<;# zO;Yx%GZUQ?7I{g*a1<)A1e*-#$pFp1R6qa%YQYDsw&(t^lb{=Hamv=IotoQ!_5Wn%I z;QNgWz-)!TuMaAQ15JYhX-3`d8G}130h*|>HE-05UmN&}JXtqXnR6NDFH*6A>S21I z-KiZ&FU(b1ZMz$lAoK468QKIB^6M><7il7FP!}^XiMweZ*fuv<)LKrkEX${Z!4Lm~}g)2VRcVbiz zojObpVL?$$$+VP_?L<@o)piEvsrp^YoBMaS3yNeTOsHnC#Nm*u%tALW8Q_ zHI2qszaAW)7XF@w)vK$oU0kqVlNX&8oo$dcd4=EMRMgqps`{TZom(Z9qB;`CM^xvj zNp{h@YH33FQ2zi+w&O8BD!;QI8XN85IpIslekicp?LhUDRuJuf8Kh*{k&JTRz?!P< zp7wSl<62*Hab1m6+rUM{mL6iQ?7%ae4~=ICm1=aTp)a`Vh|sptbDSTIL6>Gf)xBq( zJ{3~RIaZc#2+%v7sL8MJHDA@i&+M%8BGh|>fF_SC1MSq%JGgvncW?W3`-aXv=WU%N zjzNk`(8|L#I&}*2S7VYB@U1S(-n*A*pWKBR;A8o)8-;HX$oSFb#kMNOhS2?^-iuiK zDnAyx{{R7Azqf3Yx9p`#MFD~#`mI{8Z5RxhxBmHpKyJ^OS&4u$z5)=@gJO{P}nHi9dJsyWn`J`_6&+H_&%f8>JuiO#1|{we`g z=UfjUPo5MU^wcUkri1Dn>)Uo;+S>?rsk`nPXOWaiWmIU=4nPXb~Gk58z__lbBzK+M3B%}-m*q)t?F-305vwJCP6h)YQ$A&p-B=l#&F$TCT&2>mMj2#tMDwdHG)My|xU=3Y%u?$$2G#%0n zX=ZSoyJ?9F8Y;uMKBObzR*FLiv|tY#V^=%5&(&&^%X!f#@hY({tb~D%YJOF78m?<< zAL=(8!SkW(n378injG%?2kqCyHkkY>jTBklg5Kf!?eMDE{{R`MRu$u814{aSbpXZ< z*{uN_SojQ`HF(^^Aw$wWmXP=WsN;5tvw)~M(G`Auy=Ghe+mgg zP4#`1Q#c$x+K<#PA@daKl@spdE)m90QdUFt(7#f=zS@zw2P;wIPQtt7?#meFKk9vz z1}V?_zh!s4-W9@A#M-oD>W$AQ_YxtW{;~N~jl9SGV^Xqs-mV^{W~WVpuVuRgb|jmb z0X{TsyiWp<2x3j|QX2SFl)oEz)=Up0E_W=rG85t}zgUAcZeL6739R6Z=qG6H^Z3RXy515wZDDf7{9W z?eM5Qxc>mu`zXUVAg8*6ls_|6ZsO-CSL0Ow0B?R050yvgWf?H70g{iok&mTU$W+BF zjNvQ}qiVnDCASJL*KX0dceVId2IDCVYB3i)NvnG?Y77OK5OAr;Rg_wT3=Hc2HPkIe zx}(9AfKmD&{GuBAv z#;5(eU@+5Fd*rH7<1!8Fl|n8mGA=eR^Dw8 zUJ~Gpg}P79s(YH+-qp_&f8kgln_&clq+8|<2==rWI!PV|^kdv*`~dmYf7~YEi> z{SMq<*d9%V89QW6=|wa-HnD87I` z0+hS)H$3Z!W5$4C7jEGl$O~^9Rex5^>H8>U6y^uYhViG;EPN@n><3=V+3f!SxHp}v zTB-@4e0`=mZ2tg=5%$)9a^LT}p5*Q~ZFb2JV2HewQkpj-)2`k`*J|C2)xYI5$^><5 zRM8p@L0{>s`;!dU<|@iv&Mc|oX_Zio*>yeN?34ch`Y^m!X$Q{7@2?r(+2-$C=|RBE zzTGEL1DOrTz1}O`wgo==-27W-N4{>L><(8cDx-_tSex7{4gT-+G)l zi5o-cRr22T0-o)=_a$lAO2ge_azHqIvZrPJ-`{13#Aa31fpkEv@H{IYStjQj(mCil zj--1Lc>L>(YNG4Hu7I|93bu&&lS|3>V{u)9qcy++i`7+CL^lMURVB|l(g#FOUplGR z&bwLXY8yN7I8l}lwuw6U8Vf5EdbwxkRAzCT(v5!g zwCr0bwxm3b?@ltf=~Lh-xq)JArpIggaJ$XOyvH59C+YtH>Ob5n&dkKK8?$0b=T>%R zV$5z%WYEc}TFtYflvPDo&{);n(3sX76XI%wVMHQ_Ap-%OGD2CD35Dtk)x%g?yHMgP zkVa48fOaYRx}D4V{5Z%`q=4&eOz0? zXt2N~ZlU>W>OA}fI8I2SzzhJ%MF#r?SGmfliX%W32M@lhI(u$ZFmDlD%sngdG&VGy zM+U~IO*whMyL?Ne$2M=LUAh~-9EQMlOh zG%HjUyBV~ z6=*r`GOFx24Njp+f<{Eq5=(lG={SY9hBed^el$OE4;r0Eg*u|_PS>*Pjw(5yok3Ih zjd5ebs!WFa-kjrD_Qj{B}2#OR|5G`-qRixD;%nN zZYbz0SAAI4i|1YKAk)+)qh(b;FIM<)M|CL31Nf_^{f8?PEVCb>qq@3`BAmCcBZW?Fo6EI z{{W=bKdt`&=`|F!RJCn;n?j$i=NY06@gGH0*wT*2S@5M{9sdAu{*Si0lhs{9Ljy~{ zJXHMX@o#pF54u?o3@=%isicC2sNC(_DF??2AS&LL2gueftE@&?c~*lPnoV7H^R_D+ z5#(zpXT99O*GC}uUj8i(?&3#cD1i7>-syE#JND!A>N)Bc^j$f-}< zk^l_Q0uSJ8e;Pc0xV8=b#F0Kmp0um#O8IhC#~;)X?HjY6k@2gqWt94)QQ$GAM{@0R zj-Anq!GRQLquVhJ7VbAc;-*-aY50?V=G|W({vxZ{kb2}N$W_<0?M8Z=<4^k=gNiyg zk*+DZUsPJZ!%g<<{iNP|zvd)%J4nU-pnUPD3IViRYxvj-a@vnjbUsu!+swoA=Of`; ziU-`Y-Toy6TY^0*z89$WW;|3?8)GoV=cAKa9&^P{5w08?vkA0%1hwhZZi5GWGt z_Oh^P2q!L#E0}E8h5Sua&l37YE4_Qvdg8xDbT2n-+8cXXf#Y+9E_+}emm-~Q$l$*^ z8*Y#Eibs;AtBUdai9W_<7ZP92moaV>@g}qzbAPMlRM#VVRoloKSCh1ku|BN`mYilj z%8>2Goc$j5TowmDcvXjF?oa-hU-23ra6fGcYv*049wM55+uhB+mHz;mhJSB&A@r}# zhd&d2v34rV$H~hD~cy@^6vYvoT_Gtqf%b!|&$YG4@vjfi1#@-qH&*dy<^b0a^b5?rO>u zbSU65sT-s?0zB(LWN3@!LUU>X-G#VAiOkTB;Ra^38<19PYK+RblS@gwQG()m&~73oUk0~fD7E>XbB{P4iryuxl!9;Ub}>{@~+YX+@vjA~h_*Rw$2PYTmxK|>i8Lft?XA#Y|pg%G(SsiPce z(~(|=foS85Xd~NE)8kbqLSFYRkC`-@qptl&2Du|o@SQU=>t~1WPFiPe;P+qb2Zm)W{{$@9}nYG?s(D|)qp0jdA`HG z=ZLBIzp9s5UzIhn*-1X-W3|D=`A~rKeTsYIiJ~mZYtrqzCeT|_3-KgZnC@HDn|9-9 zqCK=^s#s#y`j4Gus4ZZg>W&ptI`XBLb0X(v6m*t3M~@I|G{u$JpL>$md+qo|L%@xS zlBdF#cqUwqq2Oq09R@#8+=X|(PbyDKgNl<^WM{Xx5kbcr-iD!sGQ~*86I55zkQGHq zZHTLg+l{C$QWwN3zO1w5Rt1+aenP1qMajgPC%fTQQyPM z;4@erHNr^AAT{|KYQBPAuj=>)IaF8-c+?>bZG39L6+K@Ha(b6Xkw_@)r@)a+N8G!N zevQn6+|B<0jVXM|!u7zM^W{WVlien2#ov3TwO5-`k^#6EwQq&nKlff!f5O(U9RUUI z#@4q_5^L2h^nf$9M>U#=Z>d}~roNS=bPjuGXpq^r6RA82H6yY1N6U8q0P|3k+Qj_o zk%drinIz*;mRpaA*Z%;gJ5kGXA^!k4tAF}qw;ZOB{{Wm)GfD#VdiZjx9m`BovwXdr7sZHkTuu0nE$2#1QA@?;` zv?6*UPnBQvF26t?Rg$~@;-^bU!0;sJMPBRN7Xswli50XqrkICHGMMhiCgoN38Q_fB>m0a<-V=K0Ps)+Hwzk1cwteAu=Ay+-1gXiyF6>* za8KD@5>Ds6lxmgT#zyRILmR*76}T|UJ&e8MvJ5qQzu`~kNlV;2WViPAfbuK=uR1rN zeHC@?2s1$|TmVVtE8-)OP8szP9ka~zCAP#lIxb6P{ ztL0Ws=eJe|s}Bm(e-lMPw{Ativ#I1oRQB`2L-7@&-Q%^g*z0CIO48@J>~HFOe};!E z_F#&Mos0fDkI=Uky*79IAH?VUwNKY<{{XAyP0HPwp?4SkCY-80k~mXCce6ZLd?>3o zZfxZv;aijJ!Nm$k31e)97;T8*dSPentNx)s14J9H-NIk6*5vyKiWg0wVav|D^k;>Q zGy2Vk{a>)xey?T!08o65ZcGq`8)$zI%BlKBzEt<>wtw{nN9uN;^;VB3*xXQ`=|C4b z@}aag%AYgs5BjTBGHlQKt4EiBIQW_7Bg&x0cvI!}pY;^{YNhta>tCI2UI5|ZA)wc2 zYIsE)ohU)^6=SjSHNN6E+h%@)QJ~Z3Vt*A?wnSw3*87XNKHq?rlU=0K2WueWDyMGz z#U6ej;ot*F=TWD|jqJTgwA6Wcn~#7k71}7i(^PwHTbGHTh{#i8iKZ2kh_xu=2bsH|Z7flJ=2L;YMHKPr#bL*w$IsDSbWwMLuJ{{UAPjd$wf zrs9R>$#||VFf~+Zkl@!Gjx|54j;PbdO)}GF2M=&;w_;9Y-m9jrWQd+M8sg??0H%{x z3tU+*fi>Rhc-AzQ(^pYy7?}qHQ~HGDYZ^ykj(Js@CD*6ap!Hjwt6#7v0$F4hYlHyi z0M5M8+>k>h)rL$Bh^@W0;o^w{F=rqaW0@v{kfv>SZTIQBX5rA;*?qM0d@IGMu&rM0 zyEARlJ{seUx% zzJ0&yV}Y6hdr6Qs%#I`uHm#k~_g4ho>2&)Iw#J6d{^SuW@QsfymHg z+IJ|n>A90`%M05}5uUG38RNo(w_WD$Q3lxzlD0~s=EIE$46{LFW(16ebz4z;cV_M~ z_YJ<=c&`LA>N>@-SjF2;Vx)HM-0vf7;(1^aGDi4ySlDv8@}iJ=F2J<-)LWSqVcWZe zp5RCvn2A{}!G>$%d<7^G%LM?IYgl7*e6XTv@EA7yLZFo5)h*ilipr3kyZf?VN{bS7 z`m)N`#`VkEyNk&rNw;=*fG(oO!M!KO^g$(c#y+a=aXHoG?LEpRk)+#5s}3?XuuyT% zldJ)aY0kS^^PqTC+VzYY_0>^QYZ#l?Rc~Eb$ET0>#=w7aNhCgDe}yughqXoihNJyt zns%?PnL?axk>gyF`?A1d+ihVMiWEWMqKl|m0)USYD#2>O4Py(o z!(}I~1aCDIti7AEA70%xa!Z5%0EE_)L#$Ym7l;^rv}kte3fd$EkJQ+aLSJ|tDy6Qk zvi-~k{k7W&)Uitt{6WpW+6#WyfrsSoqyXYI0K@LDQ2Q6$VJw74_!p0vqQ|k@#JW)h zylAUiy9>1=Wjx zRIGiHLJCWyjJk-VRwTPvbjf3GB7y8iaTX|~hBcM^S-CT0cI}gYZ*qJ(fvG*VJjUSt zm5H<2=!5k5RAxoZs@kooP~6marx@fFDZ{j^fGu11w8mOM~WA{b?Dl52kK!_?d;A{kw#Z%@-#mW zm@4ZVUxgGw0XA7~Xsg@9f2l)~K!z#>>x$cmrW4_X4RbnrwUc)ixRQ9F(CbsmN?KD2?>}?EHhE^d} zNhcvyXyj97QV7nr%8peUM=C#c_BMtcb#41e#YI%X5&B2UkKJ92W37qA+N4&aZQ#w6 z3Jb2tUkjhrVk^xoUG?)Tcx$|CBP)p7-|=SM%byWjl*{{S$f%Dq}fY4$U& z0S^xF@c^y_8qq(uJKz4^{{ZF{U;hA4cd`Ef;<550`PSuM?m&mwMxffB{{Ud`fBQ!H zkLOT(7kU}(AME~gc~|?F%+UJ?S!yh_@$9|WXSIK_sC!Ry2OX@RDm<(G%jO7ugzUA! zai>4pdy&g(4tDYRM%?MUo^_bc(WzL;QG1(Ez3ETZ zeswoVZOKI8L8m(~jN?g{f5d)txslFnPsY1ZrmbL0Y8<u~ zoet)@=CPnAqBztRG(ASUQKA5sJnF1TQ;!O+qfl6y#up;Gh-0Ys&pK%q8A`gmh@`2o zYz{(;b4oWLXU>#0})2`h->fY3!gw>O8JCKN^ zlaQe+xuN!8tEkVmnm5rZ={!X>`VF|X-LcAw*J6~zd(1-P6UoNreRXLKj?iJ$Pn|73 z(UxXdm!k__uyT8QW3MLY_2cPsFHuJuS$Kd2U-WBiT;G*u$s{XLP5z009Z1;3zW{tnyfoDp7W!STHxzZ)3*QX=O4wYiT?{%CJ_1?i{s;Dg{}IHCki_Sr=O> zUfPIToHI7BV*99DeZ7Va#9(dqO9tChg^aTfq8j$Y3h|W>=`=ul4b;13-0Va%ZP#KW zjvsu=3DKw*jUyRqu)7`{s{4l9I&XdL&feRNFVyh|DbApoH#TWXM>vb^M}7?u62`&y5;t35Zu^<4(E^)c?@eX2hrx1gsQ4#t8oF8u0*x%!P60LHs;s+kzl`d{%H?JxL^ z0|(aJ>!>!9@z+t19-Ma#;Qs(v{gg%S`_%fu^8&N=6&PnyaIhG$#^$5Nb}J^bcg@Gt zh<;*-d(6xT2o&%m8phS6fY}~2XojZ=dtByeT~JdU{{V5`{{YoLWg0#1{6+5x@C~O) zwyt-#D($|{wKw-Spr0)wnmwy#Y<9Dwn`5bkBWwCYph@1h>6u6W022QIDq=s}Tb1=~ z<8Ld9%iR7;v_{3$*xM0QM$|7_4WYiDx)gf$zw)&me{*b4su>sLYs|L0bekU<88iO? zNvvo`uU`Gyp9W@2=c!NKOBp*{gy`LSGOC@CC$|_*uYSY}4P2>b*u)9^;bVya*OqP0;f|)2i8+!Li1Yg*Lr|@iT&eZpv-Ss8<{XX&wH|=7;4``pt>pN5Zte#xr!DRT^tg^&12K z0PS7wY){laRAu%7pAz+oVvOIVAn0Yk1523Sgo_Ga*|_Gjcib-1qs1pP$A>op^FIQr;*#Qy+i#xuO36`aimpgs`6-R1?SD20RQ|9o*fCK6Ow)uSo~&oykA< z8>LaiAi4RP*x7#9?VC~c8|6VB@JHQL2)x9#5N$}{BD7X8272l`5X%qa6f;$*Cd4t31vP8Fivhq)7P zWPi*mhxY#fb06s6$cj9x+z`zDOU}CBf^IOUk7VvEoCoZoH*4N6ss^LUcQi3wYtExu z^P{%hp|prp_==BdKM12JSYUOnKxo4PMf@n<(sHR0sK{274NH%0x|KAJMyCp`tE^~1 zd3YAWriWuwcB91Hi`N1{xHcn*r~vY=(s-Y?w-a(C+?$hg#LtcR+*-e1I{<5V&$8<$#X4qM}Nvacz%m9<(EdV^dF z{vlEdlVHMu&kZRex~9v{yQiHP7E0Q?NI8nN)~8b1)u7T0#)pMRvXo1ucBHKakYYH; z3b0iiDs?9+?P~(?syf@XESmiHbU&3@|h%ML$TZ8Ca4@xj2$>CZpUnxPy>02stfBu-pNn>uz-# z+nsJE7q;QL1TZzC>lO3(O*HrsW%x7xq(imr^B^%U(;ZPD1 zEpjcD>MANgwvoI0IdeI_!8ccc=w*^{{Xvxv-wp|dhWmbr~5yZBx<$2AMH1*#C!eo zyMOMV?EY0#-#fql>Auh9L4RxXap}?S-0QdZJSl3+hx7guC1qmwecc&O&07wU?h4Zx*6LzKO@Or)#mgp{Fj8|Twq+1`doRI~r2|OyNRkacaf#R8Yl!EO^+%d z(^Fec;M5j|%TD`k|Zk(;dRc$+)P$DBzAw23u?^hS5 T^n=t>*=}{!d~2xsL8<@Qf<~rq- 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 literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_searching.jpg b/assets/covers/chapter_searching.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08ec6d9db9e5845cc74118d180dd270d46b20e14 GIT binary patch literal 131797 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

    `x8>Zx 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%0A(<51#sIeB!ZsHt0hzznrlN$R24F$H1ESQF z(g`AB7T+kn^Y2jPK%i%jGkTcDMpW!%3d~Kgz)^Q^8QikEGquHteImg}MG93zU7=2Rcq9QK(z~(e>4~ z5h-+H25pZ}rwAlC+J#+SBzi+)b>AHAl~BbIC63}Da!=MazoLfkU+!2e_onWJ83pia0g8Z zY;0!RZ~W&w{*!!bs-6@70OJ|kg>@gF@F+TM_VOY>J&o$8&9{sH0Cb-~_)@YGTOM^; z1|LpUeXF7-S+(Z7{l?#LQYNz5O^Sn+&nkbL|0H;Uax;jB4f&)jCc?&m9W|210tWyy0C1Q zodHjXpbMRLhjQ%dYQ>WK2p?4zPDGps~l3iLr4X2<3VLA#5Q$gnmfaG+P65@wuFZt zO4YZ2rL}DPosCPEvB6kn%Y{l<7}Qt;jjjj2tG7m%XCfvf$hdka9xc~SmdJZ3n{$1n z$U|D<|}tPB|}dKsi&MTZZ;7r~Z>ot;szBCjMt_ z0b;;$j8rcANB;n|5&lb1V8UbR9@_1>wfeoroGySI?#acr@t&f?-(CBK(i`^RDaeOv z9%yaP-9;Gf(;Hcyi~vonu`>`ODs(^B%xUWO(3f|%wTyBAe)#Lz6+A$<3M__X8oWcO8)6sXNk=q_bSqd6iY&6qt>Lj&wkHZ2ay$i>buwDSHOU?1 zUxgA0WRcYvMsIta7~m;4b1DYosPix#g4OARBt26o9AZ;f8fVBmIT94)5`%BWe8L5Ew_#Gw`7gIFW!MR9xFL%JrHgb{cf9M2tU; zO0fgwTYT2j{AdC1_jyRaa}#TQ4N3DUe$wHFU{-mNh9D+C`o&+ylrx1O1vpt2kjB5< z<-g9px*q3yF-1D~oSMVeg;ojXV`giDuZEB~8e9n-FLr!IfyRI>`-|IIz3=sy(Kfrt z_R@HaFP;K~Bane`b#+w1sbv=!Y96XUYJa}Ma0=ea(m~u&&?^aNo$%L(5n;xzJko2G z!wdah0+7vV)BrHfvZsdUQs7N7u-?hKkO#MS9IH&CoWS)|wUNo@W!i=pagJ9VJro#r z?;C<~TO3DM8rhx!DwH^MidizkORcll1TzpYolX+?xCOYqCv8GkBJw24g;vtink2bw*%8!8#zjDVz<`rn_+>W z`Up+7?X+N%0vHWes;sMsvA^)OKj#Nl@D4#ozO#!lXUCmAfOT-l4Xg{>JN;S!)8UYD z8du*|QbcM_J@frEOD2~Za2i+UIM6b?uhW;2G0>QeR|g*qQRi@ClMF*gd`>^`qYbQH zDlVMQd#aSAfhiD#Trgpc`SY!>-NLDMU9s8=4Kv(d=Iy0q zt+JDXS(|YokwygGikol;d99W5xH32l%K#ZzA=lx|oZ8u$ffE&-ssX z2(|CiN$UzjkgqPOLW^6&bL^~*vA%)8d}~HeF;_+j0amu1WQ;G))Vysiuvn9abv`uf zg`5M)UoUHJ10S;|^qLOa{@+>mR)j4!vl|^(Ni3?WF#^LXUv076p-oXYcRx)z*q{^x z9$g}=Jfn6%8bG(+qEzf41Pfy!Q*vQ;?4T<^ilw|lZNM$P z6{?l#LL6lT^@f}Uobat{GS`*C|Ln2kSIDwyYjG8s}_FU5G*F_05{ z1zJ6EFn^e1hh0DGU{29XBw%5Au)jjkp+|JGs}tY)r;b$oGrq5s08Sv9&DQLsmSgh) zc04kqrGqpg+D(sikIQuz!xA#6+4+2tF*4`_?>f>g5CH+=TKzdxK@jnmEb{bG7lLi(v^s^%EVAP8L0H{0H!@bc} zXKxhgVz*J10$t?D#A>()3#j;2?ggNcZX*X;#s!GSQK>B)X6l@A@A0ZG;znIWi|V(^ zIa59(*y1p^)m}8727s*Ke6eAF{FTFWs6R;CFVv%xC?E!3@GruITXHRSj~uS6@TGvs zRPzYp8dfp~{{TM8QLg zlDSnjnt3J|zl*k4Vk45^kVtWz`l_oY)iM%`{u5mZw9>COKEqN)g}OyAKqX|_+S;TY zXg)P(bXWj{>H+aCoX1@)FU-Q(QHcD8{A>Ltm<8E6JA_*=*2FE3%4mC8l~AMginhxC z0J)0d*FNJzhi=BrhekAD28QC;ka6~ky38MS0RW3WH|gr2h=|k3VVzxJDI{-ufg<16 zQ-O&Qrbg>Mv|0Pon;slGs>kxTC5}qu`i*No`(-E2E!Lk3RZUfh zZX@eog=n-MUT&rBjmqjH8kC1%tQLgh~av9-8d@}&@CkKd*@7z96ZDhlU^ z{>qx@Y=|x-Q_$biYTFc23FBjYdTOxWTAc81!&D6UFNSc&%W9^l0!|otV^stzV{wn7 zg)kw8JQuR7sjXlIx~rsO#}Ea8%c_I}GEXA83PzioTyvpH%^=kF3=Oc#tl^86wjaP$ zNY@u53(`pgD;5Fu8(-sA5ed~!uq|)_rgkAD1!Y3kHw22-h8UOS7V1$`Yr`p4R!q&m zmYI9StdtJ+gbg6K*Q1C>KW$V=A2CZdl5n*l>}k-i z%1^GTc{nvFz*zNGLETEfTAHlrO~Iu6R=33^!EkN{KNUz~JQl{Upw&`mpKKr9SQ-!P&0sHaV^SVNVzva;^h+QI1BHROpg@qYum;#w!xE(5>bGdF(D4wgF}4)| zHJDosC*435(sYZHjjDAWa%0CYU0TF}=&N{a9jt>AZhP3!1a0wRc`No%W44@lai$|e zmpVWeY(@Uf4F_}!CgkTjw z!x4Xta!YbSM8F@b)7M=U!&n<&C~-EcoWJ8o0~y=zJOwiZTi^wTob#feKXLy6YBcJLsHn3AI3Eio4M zEz$6!CsnVAtl+6K=koC9Qt_a!-dLNwH7Y%la$?M9e!$oB%P0N7& z6u`Wz8!M<{H5F^b9RMJ93$s`4I6D6(<{4vARQ!7G_(YB&N#N9x>sBey=#~QSe z_>;)Gbz(T>O97C{G-c2gYqKt%^79=O4ZbEqc*@jK5E908+q}5?XggzY{{W29h`{+Q z_EmCl8ol)~N&v*)8m!k5xfzCD(?XucD~vnm`e;com>x-VGfJ7Paxl2#g{q6@8|Q%T zJVjAr)(9zWxC;!VXW=$IWKon`%g^EW(FsSq2E|94`GaC4Hs}N4P~K&~`qH?+Ra<5+ z6~7fs=op~utCcYbm}RzGoy?MzmPcWtObNr~GzR|wPY^$8z0}UqCP`VCSQL=ohEy@M zo=74JgxIk@nk7&5>I8TU%c-4499pOLtU(&m;1g?`;pn4&+F__@ISYD?SncK2s4H7c zoH($sr9Pv9SQH83AX?xt_R{NefN?sh^xI6bEUbl9QyY#-X&8}YMGSO|Y)HLQVi|ax zgg<8Yy8)fLY9NJ{K;*54KQO*Wg$wraDINQq1+>(_fn+3bG7nItzzN)c%UxE}@UE>% z3SLqT*}XI{E|s7sm+bp#M-6t=EL!bQnA#hV-Yu#7tUuER4R};H*H#QErJ5k{{T0-nO3^JzU>oi zZnn<>R4}frt%=H|+c3x5i3|bMKAh=&+TfI75|PI)W|rKhmH=MX=S6l8K~W;Ncwxe& zk}U;-<7%pw0|p>eF`QzKa;M0Hk*~|p9uhq+`(*IRu?z+CreY-QY;zL!(4~DS#kh-7 zQ^!&N0I@|np^WmlrZyKIJ&liq#1YI=n|CENa0Z>&kIa;FiRiWy5)f_1<#94dFU^fL zvE0x5n3d#mrPL5xrh~b;2u~`QPMPC8q+Z&rHKB4#?O4jrtOt3!YJ4_K-u+Z*_NXRy zGsLG;U`e>gs;ZlKl;8IedwvwB0|&S-DbmLF>b*{aVrAp02lIWVsntY`Y2HWp(yF7qD5fCVMUvoSejODKpcvZ1 z;n%cP?cI#@kLjwÐ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 R2LBhHt^a>6`NKc2{|`xbCR_jj literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_stack_and_queue.jpg b/assets/covers/chapter_stack_and_queue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f67bc63bfb894876bed569610f3215dcf96b2ef GIT binary patch literal 104652 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%0AvG!*{;jw(&JG8=X_ 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¬yV?$ceK+q@x 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�zl2gIO2Jfw;8G5Qg0KV_SRvw| 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 literal 0 HcmV?d00001 diff --git a/chapter_appendix/contribution/index.html b/chapter_appendix/contribution/index.html index 206a1be28..762babf9c 100644 --- a/chapter_appendix/contribution/index.html +++ b/chapter_appendix/contribution/index.html @@ -1978,7 +1978,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_appendix/installation/index.html b/chapter_appendix/installation/index.html index f5176a6c2..72ac8373b 100644 --- a/chapter_appendix/installation/index.html +++ b/chapter_appendix/installation/index.html @@ -2074,7 +2074,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_array_and_linkedlist/array/index.html b/chapter_array_and_linkedlist/array/index.html index 61af313ab..92c0929c4 100644 --- a/chapter_array_and_linkedlist/array/index.html +++ b/chapter_array_and_linkedlist/array/index.html @@ -2814,7 +2814,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_array_and_linkedlist/linked_list/index.html b/chapter_array_and_linkedlist/linked_list/index.html index f7f19588f..66acb60ad 100644 --- a/chapter_array_and_linkedlist/linked_list/index.html +++ b/chapter_array_and_linkedlist/linked_list/index.html @@ -2916,7 +2916,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_array_and_linkedlist/list/index.html b/chapter_array_and_linkedlist/list/index.html index 76e44a985..adb899f88 100644 --- a/chapter_array_and_linkedlist/list/index.html +++ b/chapter_array_and_linkedlist/list/index.html @@ -3560,7 +3560,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_array_and_linkedlist/summary/index.html b/chapter_array_and_linkedlist/summary/index.html index 9fccc704a..7befd8df3 100644 --- a/chapter_array_and_linkedlist/summary/index.html +++ b/chapter_array_and_linkedlist/summary/index.html @@ -2034,7 +2034,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_backtracking/backtracking_algorithm/index.html b/chapter_backtracking/backtracking_algorithm/index.html index 9552e2cd0..2df09cb43 100644 --- a/chapter_backtracking/backtracking_algorithm/index.html +++ b/chapter_backtracking/backtracking_algorithm/index.html @@ -2310,8 +2310,8 @@

    复杂的回溯问题通常包含一个或多个约束条件,约束条件通常可用于“剪枝”

    例题三

    -

    在二叉树中搜索所有值为 \(7\) 的节点,返回根节点到这些节点的路径,路径中不能包含值为 \(3\) 的节点

    +

    解题思路:在例题二的基础上添加剪枝操作,当遇到值为 \(3\) 的节点时,则终止继续搜索。

    @@ -3213,7 +3213,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_backtracking/n_queens_problem/index.html b/chapter_backtracking/n_queens_problem/index.html index 5d15a7d43..10e01bc76 100644 --- a/chapter_backtracking/n_queens_problem/index.html +++ b/chapter_backtracking/n_queens_problem/index.html @@ -2374,7 +2374,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_backtracking/permutations_problem/index.html b/chapter_backtracking/permutations_problem/index.html index e7bd2e4f8..e8b36c435 100644 --- a/chapter_backtracking/permutations_problem/index.html +++ b/chapter_backtracking/permutations_problem/index.html @@ -2599,7 +2599,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_computational_complexity/performance_evaluation/index.html b/chapter_computational_complexity/performance_evaluation/index.html index 545cfa291..721146bbe 100644 --- a/chapter_computational_complexity/performance_evaluation/index.html +++ b/chapter_computational_complexity/performance_evaluation/index.html @@ -2014,7 +2014,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_computational_complexity/space_complexity/index.html b/chapter_computational_complexity/space_complexity/index.html index e0d6f0c85..e958b7ea2 100644 --- a/chapter_computational_complexity/space_complexity/index.html +++ b/chapter_computational_complexity/space_complexity/index.html @@ -3508,7 +3508,7 @@ O(1) < O(\log n) < O(n) < O(n^2) < O(2^n) \newline data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_computational_complexity/summary/index.html b/chapter_computational_complexity/summary/index.html index ebef8acf4..6b597178d 100644 --- a/chapter_computational_complexity/summary/index.html +++ b/chapter_computational_complexity/summary/index.html @@ -1954,7 +1954,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_computational_complexity/time_complexity/index.html b/chapter_computational_complexity/time_complexity/index.html index 592f408f3..d87f445f7 100644 --- a/chapter_computational_complexity/time_complexity/index.html +++ b/chapter_computational_complexity/time_complexity/index.html @@ -4641,7 +4641,7 @@ n! = n \times (n - 1) \times (n - 2) \times \cdots \times 2 \times 1 data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_data_structure/basic_data_types/index.html b/chapter_data_structure/basic_data_types/index.html index 0e8aed0b0..bd71ee16a 100644 --- a/chapter_data_structure/basic_data_types/index.html +++ b/chapter_data_structure/basic_data_types/index.html @@ -2044,7 +2044,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_data_structure/character_encoding/index.html b/chapter_data_structure/character_encoding/index.html index e341141f2..7db432f36 100644 --- a/chapter_data_structure/character_encoding/index.html +++ b/chapter_data_structure/character_encoding/index.html @@ -2031,7 +2031,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_data_structure/classification_of_data_structure/index.html b/chapter_data_structure/classification_of_data_structure/index.html index 0ad33e058..b33438c10 100644 --- a/chapter_data_structure/classification_of_data_structure/index.html +++ b/chapter_data_structure/classification_of_data_structure/index.html @@ -1963,7 +1963,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_data_structure/number_encoding/index.html b/chapter_data_structure/number_encoding/index.html index 1ee607019..70fa834ad 100644 --- a/chapter_data_structure/number_encoding/index.html +++ b/chapter_data_structure/number_encoding/index.html @@ -2068,7 +2068,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_data_structure/summary/index.html b/chapter_data_structure/summary/index.html index c2e73b59b..7e1bbe09e 100644 --- a/chapter_data_structure/summary/index.html +++ b/chapter_data_structure/summary/index.html @@ -1941,7 +1941,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_graph/graph/index.html b/chapter_graph/graph/index.html index 039e89d2f..49a459e9a 100644 --- a/chapter_graph/graph/index.html +++ b/chapter_graph/graph/index.html @@ -2093,7 +2093,7 @@ G & = \{ V, E \} \newline data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_graph/graph_operations/index.html b/chapter_graph/graph_operations/index.html index b201631c4..ad0bda320 100644 --- a/chapter_graph/graph_operations/index.html +++ b/chapter_graph/graph_operations/index.html @@ -3416,7 +3416,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_graph/graph_traversal/index.html b/chapter_graph/graph_traversal/index.html index 650db2a74..9a1be92f7 100644 --- a/chapter_graph/graph_traversal/index.html +++ b/chapter_graph/graph_traversal/index.html @@ -2606,7 +2606,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_graph/summary/index.html b/chapter_graph/summary/index.html index f41e53fa1..5e5c6d145 100644 --- a/chapter_graph/summary/index.html +++ b/chapter_graph/summary/index.html @@ -1943,7 +1943,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_hashing/hash_collision/index.html b/chapter_hashing/hash_collision/index.html index bb9d93516..e8ddf30de 100644 --- a/chapter_hashing/hash_collision/index.html +++ b/chapter_hashing/hash_collision/index.html @@ -1993,7 +1993,7 @@

    为了提高操作效率,可以将链表转换为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 \(O(\log n)\)

    6.2.3.   开放寻址

    -

    「开放寻址」方法不引入额外的数据结构,而是通过“多次探测”来解决哈希冲突,探测方主要包括线性探测、平方探测、多次哈希

    +

    「开放寻址」方法不引入额外的数据结构,而是通过“多次探测”来解决哈希冲突,探测方式主要包括线性探测、平方探测、多次哈希

    线性探测

    「线性探测」采用固定步长的线性查找来解决哈希冲突。

    插入元素:若出现哈希冲突,则从冲突位置向后线性遍历(步长通常为 \(1\) ),直至找到空位,将元素插入其中。

    @@ -2042,7 +2042,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_hashing/hash_map/index.html b/chapter_hashing/hash_map/index.html index e1c2216da..0ae88ff95 100644 --- a/chapter_hashing/hash_map/index.html +++ b/chapter_hashing/hash_map/index.html @@ -3176,7 +3176,7 @@ f(12836) = f(20336) = 36 data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_hashing/summary/index.html b/chapter_hashing/summary/index.html index 7b78e4f58..7c4936700 100644 --- a/chapter_hashing/summary/index.html +++ b/chapter_hashing/summary/index.html @@ -1881,7 +1881,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_heap/build_heap/index.html b/chapter_heap/build_heap/index.html index 7b13de26b..ad93ea94f 100644 --- a/chapter_heap/build_heap/index.html +++ b/chapter_heap/build_heap/index.html @@ -2115,7 +2115,7 @@ T(h) & = 2 \frac{1 - 2^h}{1 - 2} - h \newline data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_heap/heap/index.html b/chapter_heap/heap/index.html index 0136e5e16..710076005 100644 --- a/chapter_heap/heap/index.html +++ b/chapter_heap/heap/index.html @@ -3299,7 +3299,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_heap/summary/index.html b/chapter_heap/summary/index.html index 86a107a0a..fd3f40ef0 100644 --- a/chapter_heap/summary/index.html +++ b/chapter_heap/summary/index.html @@ -1878,7 +1878,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_introduction/algorithms_are_everywhere/index.html b/chapter_introduction/algorithms_are_everywhere/index.html index 51a8fe13a..8b8c5316b 100644 --- a/chapter_introduction/algorithms_are_everywhere/index.html +++ b/chapter_introduction/algorithms_are_everywhere/index.html @@ -1908,7 +1908,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_introduction/summary/index.html b/chapter_introduction/summary/index.html index baa87b382..eb28e5807 100644 --- a/chapter_introduction/summary/index.html +++ b/chapter_introduction/summary/index.html @@ -1877,7 +1877,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_introduction/what_is_dsa/index.html b/chapter_introduction/what_is_dsa/index.html index fd5388743..734e74012 100644 --- a/chapter_introduction/what_is_dsa/index.html +++ b/chapter_introduction/what_is_dsa/index.html @@ -2003,7 +2003,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_preface/about_the_book/index.html b/chapter_preface/about_the_book/index.html index 873e5128f..ad4092bf1 100644 --- a/chapter_preface/about_the_book/index.html +++ b/chapter_preface/about_the_book/index.html @@ -1959,7 +1959,7 @@
  1. 感谢 @squidfunk 提供的写作排版建议,以及杰出的开源项目 Material-for-MkDocs
  2. 在写作过程中,我阅读了许多关于数据结构与算法的教材和文章。这些作品为本书提供了优秀的范本,确保了本书内容的准确性与品质。在此感谢所有老师和前辈们的杰出贡献!

    -

    本书倡导“手脑并用”的学习方法,在此方面深受《动手学深度学习》的启发。在此向各位读者强烈推荐这本优秀著作,包括中文版英文版李沐老师 bilibili 主页

    +

    本书倡导手脑并用的学习方式,在这一点上深受《动手学深度学习》的启发。在此向各位读者强烈推荐这本优秀著作。

    衷心感谢我的父母,正是你们一直以来的支持与鼓励,让我有机会做这些富有趣味的事。

    @@ -1978,7 +1978,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_preface/suggestions/index.html b/chapter_preface/suggestions/index.html index f81ea0c9b..6bce836d9 100644 --- a/chapter_preface/suggestions/index.html +++ b/chapter_preface/suggestions/index.html @@ -342,35 +342,35 @@
  3. - 0.2.1.   算法学习路线 + 0.2.1.   行文风格约定
  4. - 0.2.2.   行文风格约定 + 0.2.2.   在动画图解中高效学习
  5. - 0.2.3.   在动画图解中高效学习 + 0.2.3.   在代码实践中加深理解
  6. - 0.2.4.   在代码实践中加深理解 + 0.2.4.   在提问讨论中共同成长
  7. - 0.2.5.   在提问讨论中共同成长 + 0.2.5.   算法学习路线
  8. @@ -1898,35 +1898,35 @@
  9. - 0.2.1.   算法学习路线 + 0.2.1.   行文风格约定
  10. - 0.2.2.   行文风格约定 + 0.2.2.   在动画图解中高效学习
  11. - 0.2.3.   在动画图解中高效学习 + 0.2.3.   在代码实践中加深理解
  12. - 0.2.4.   在代码实践中加深理解 + 0.2.4.   在提问讨论中共同成长
  13. - 0.2.5.   在提问讨论中共同成长 + 0.2.5.   算法学习路线
  14. @@ -1959,18 +1959,7 @@

    Tip

    为了获得最佳的阅读体验,建议您通读本节内容。

    -

    0.2.1.   算法学习路线

    -

    从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段:

    -
      -
    1. 算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面内容。
    2. -
    3. 刷算法题。建议从热门题目开刷,如剑指 OfferLeetCode Hot 100,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题时,“知识遗忘”可能是一个挑战,但请放心,这是很正常的。我们可以按照“艾宾浩斯遗忘曲线”来复习题目,通常在进行 3-5 轮的重复后,就能将其牢记在心。
    4. -
    5. 搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心得可以在各个社区找到。
    6. -
    -

    作为一本入门教程,本书内容主要涵盖“第一阶段”,旨在帮助你更高效地展开第二和第三阶段的学习。

    -

    算法学习路线

    -

    Fig. 算法学习路线

    - -

    0.2.2.   行文风格约定

    +

    0.2.1.   行文风格约定

    标题后标注 * 的是选读章节,内容相对困难。如果你的时间有限,建议可以先跳过。

    文章中的重要名词会用 「 」 括号标注,例如 「数组 Array」 。请务必记住这些名词,包括英文翻译,以便后续阅读文献时使用。

    加粗的文字 表示重点内容或总结性语句,这类文字值得特别关注。

    @@ -2088,13 +2077,13 @@
    -

    0.2.3.   在动画图解中高效学习

    +

    0.2.2.   在动画图解中高效学习

    相较于文字,视频和图片具有更高的信息密度和结构化程度,因此更易于理解。在本书中,重点和难点知识将主要通过动画和图解形式展示,而文字则作为动画和图片的解释与补充。

    在阅读本书时,如果发现某段内容提供了动画或图解,建议以图为主线,以文字(通常位于图像上方)为辅,综合两者来理解内容。

    动画图解示例

    Fig. 动画图解示例

    -

    0.2.4.   在代码实践中加深理解

    +

    0.2.3.   在代码实践中加深理解

    本书的配套代码托管在GitHub 仓库源代码包含详细注释,并附有测试样例,可直接运行

    如果学习时间有限,建议你至少通读并运行所有代码。如果时间充裕,建议参照代码自行敲一遍。与仅阅读代码相比,编写代码的过程往往能带来更多收获。

    运行代码示例

    @@ -2112,12 +2101,23 @@

    代码块与对应的源代码文件

    Fig. 代码块与对应的源代码文件

    -

    0.2.5.   在提问讨论中共同成长

    +

    0.2.4.   在提问讨论中共同成长

    阅读本书时,请不要“惯着”那些没学明白的知识点。欢迎在评论区提出你的问题,我和其他小伙伴们将竭诚为你解答,一般情况下可在两天内得到回复。

    同时,也希望您能在评论区多花些时间。一方面,您可以了解大家遇到的问题,从而查漏补缺,这将有助于激发更深入的思考。另一方面,希望您能慷慨地回答其他小伙伴的问题、分享您的见解,让大家共同学习和进步。

    评论区示例

    Fig. 评论区示例

    +

    0.2.5.   算法学习路线

    +

    从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段:

    +
      +
    1. 算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面内容。
    2. +
    3. 刷算法题。建议从热门题目开刷,如剑指 OfferLeetCode Hot 100,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题时,“知识遗忘”可能是一个挑战,但请放心,这是很正常的。我们可以按照“艾宾浩斯遗忘曲线”来复习题目,通常在进行 3-5 轮的重复后,就能将其牢记在心。
    4. +
    5. 搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心得可以在各个社区找到。
    6. +
    +

    作为一本入门教程,本书内容主要涵盖“第一阶段”,旨在帮助你更高效地展开第二和第三阶段的学习。

    +

    算法学习路线

    +

    Fig. 算法学习路线

    + @@ -2134,7 +2134,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_preface/summary/index.html b/chapter_preface/summary/index.html index 426a7270e..c3b9fc5df 100644 --- a/chapter_preface/summary/index.html +++ b/chapter_preface/summary/index.html @@ -1878,7 +1878,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_searching/binary_search/index.html b/chapter_searching/binary_search/index.html index 9b552e3b2..411219089 100644 --- a/chapter_searching/binary_search/index.html +++ b/chapter_searching/binary_search/index.html @@ -2428,7 +2428,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_searching/binary_search_edge/index.html b/chapter_searching/binary_search_edge/index.html index 0ef606559..adbf6ee22 100644 --- a/chapter_searching/binary_search_edge/index.html +++ b/chapter_searching/binary_search_edge/index.html @@ -2264,7 +2264,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_searching/replace_linear_by_hashing/index.html b/chapter_searching/replace_linear_by_hashing/index.html index bf47b1cec..92dcac0d3 100644 --- a/chapter_searching/replace_linear_by_hashing/index.html +++ b/chapter_searching/replace_linear_by_hashing/index.html @@ -2323,7 +2323,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_searching/searching_algorithm_revisited/index.html b/chapter_searching/searching_algorithm_revisited/index.html index 658ab9769..7670d651d 100644 --- a/chapter_searching/searching_algorithm_revisited/index.html +++ b/chapter_searching/searching_algorithm_revisited/index.html @@ -2062,7 +2062,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_searching/summary/index.html b/chapter_searching/summary/index.html index abcc7e924..9c5fe9656 100644 --- a/chapter_searching/summary/index.html +++ b/chapter_searching/summary/index.html @@ -1878,7 +1878,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/bubble_sort/index.html b/chapter_sorting/bubble_sort/index.html index ba6b5054c..f3c64857d 100644 --- a/chapter_sorting/bubble_sort/index.html +++ b/chapter_sorting/bubble_sort/index.html @@ -2382,7 +2382,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/bucket_sort/index.html b/chapter_sorting/bucket_sort/index.html index 436165d24..4ed357830 100644 --- a/chapter_sorting/bucket_sort/index.html +++ b/chapter_sorting/bucket_sort/index.html @@ -2225,7 +2225,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/counting_sort/index.html b/chapter_sorting/counting_sort/index.html index c1269a623..d2dec1bd9 100644 --- a/chapter_sorting/counting_sort/index.html +++ b/chapter_sorting/counting_sort/index.html @@ -2574,7 +2574,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/heap_sort/index.html b/chapter_sorting/heap_sort/index.html index 5487692d4..fc3d6d056 100644 --- a/chapter_sorting/heap_sort/index.html +++ b/chapter_sorting/heap_sort/index.html @@ -2227,7 +2227,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/insertion_sort/index.html b/chapter_sorting/insertion_sort/index.html index 3a7b211c0..7625dd5f9 100644 --- a/chapter_sorting/insertion_sort/index.html +++ b/chapter_sorting/insertion_sort/index.html @@ -2146,7 +2146,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/merge_sort/index.html b/chapter_sorting/merge_sort/index.html index d0bb02074..4285b920f 100644 --- a/chapter_sorting/merge_sort/index.html +++ b/chapter_sorting/merge_sort/index.html @@ -2471,7 +2471,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/quick_sort/index.html b/chapter_sorting/quick_sort/index.html index 25b543204..dcaecd53b 100644 --- a/chapter_sorting/quick_sort/index.html +++ b/chapter_sorting/quick_sort/index.html @@ -3018,7 +3018,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/radix_sort/index.html b/chapter_sorting/radix_sort/index.html index f16d2be2a..80f94d418 100644 --- a/chapter_sorting/radix_sort/index.html +++ b/chapter_sorting/radix_sort/index.html @@ -2496,7 +2496,7 @@ x_k = \lfloor\frac{x}{d^{k-1}}\rfloor \bmod d data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/selection_sort/index.html b/chapter_sorting/selection_sort/index.html index 7aeef9c39..0b34ec87d 100644 --- a/chapter_sorting/selection_sort/index.html +++ b/chapter_sorting/selection_sort/index.html @@ -2087,7 +2087,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/sorting_algorithm/index.html b/chapter_sorting/sorting_algorithm/index.html index 9fc954d80..04b568472 100644 --- a/chapter_sorting/sorting_algorithm/index.html +++ b/chapter_sorting/sorting_algorithm/index.html @@ -1963,7 +1963,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_sorting/summary/index.html b/chapter_sorting/summary/index.html index 2ab3843b5..1c1e76daa 100644 --- a/chapter_sorting/summary/index.html +++ b/chapter_sorting/summary/index.html @@ -1939,7 +1939,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_stack_and_queue/deque/index.html b/chapter_stack_and_queue/deque/index.html index 3f5faa523..0ce719753 100644 --- a/chapter_stack_and_queue/deque/index.html +++ b/chapter_stack_and_queue/deque/index.html @@ -4608,7 +4608,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_stack_and_queue/queue/index.html b/chapter_stack_and_queue/queue/index.html index cfb2c28b0..531a7d4e0 100644 --- a/chapter_stack_and_queue/queue/index.html +++ b/chapter_stack_and_queue/queue/index.html @@ -3707,7 +3707,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_stack_and_queue/stack/index.html b/chapter_stack_and_queue/stack/index.html index ad2bc9b14..9eecae3d7 100644 --- a/chapter_stack_and_queue/stack/index.html +++ b/chapter_stack_and_queue/stack/index.html @@ -3438,7 +3438,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_stack_and_queue/summary/index.html b/chapter_stack_and_queue/summary/index.html index 70a91e596..a27d4ccd5 100644 --- a/chapter_stack_and_queue/summary/index.html +++ b/chapter_stack_and_queue/summary/index.html @@ -1877,7 +1877,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_tree/array_representation_of_tree/index.html b/chapter_tree/array_representation_of_tree/index.html index ad98cd541..2466a8f0c 100644 --- a/chapter_tree/array_representation_of_tree/index.html +++ b/chapter_tree/array_representation_of_tree/index.html @@ -2040,7 +2040,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_tree/avl_tree/index.html b/chapter_tree/avl_tree/index.html index b0ec28bb3..b09b22d47 100644 --- a/chapter_tree/avl_tree/index.html +++ b/chapter_tree/avl_tree/index.html @@ -4017,7 +4017,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_tree/binary_search_tree/index.html b/chapter_tree/binary_search_tree/index.html index a11177b66..92afe06f7 100644 --- a/chapter_tree/binary_search_tree/index.html +++ b/chapter_tree/binary_search_tree/index.html @@ -3201,7 +3201,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_tree/binary_tree/index.html b/chapter_tree/binary_tree/index.html index 6f3f7dd26..10dc02f7c 100644 --- a/chapter_tree/binary_tree/index.html +++ b/chapter_tree/binary_tree/index.html @@ -2491,7 +2491,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_tree/binary_tree_traversal/index.html b/chapter_tree/binary_tree_traversal/index.html index 3a91388e1..80cf0fc84 100644 --- a/chapter_tree/binary_tree_traversal/index.html +++ b/chapter_tree/binary_tree_traversal/index.html @@ -2665,7 +2665,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/chapter_tree/summary/index.html b/chapter_tree/summary/index.html index 91fe53345..f00514ff4 100644 --- a/chapter_tree/summary/index.html +++ b/chapter_tree/summary/index.html @@ -1883,7 +1883,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/index.html b/index.html index 1a7747e38..bda7241e0 100644 --- a/index.html +++ b/index.html @@ -1943,7 +1943,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/overrides/partials/comments.html b/overrides/partials/comments.html index bac275a6e..1804e05fc 100644 --- a/overrides/partials/comments.html +++ b/overrides/partials/comments.html @@ -11,7 +11,7 @@ data-strict="1" data-reactions-enabled="1" data-emit-metadata="0" - data-input-position="bottom" + data-input-position="top" data-theme="preferred_color_scheme" data-lang="zh-CN" crossorigin="anonymous" diff --git a/search/search_index.json b/search/search_index.json index 874901efc..1319a31fd 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\u6392\u5217\uff09\uff1a

    \u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 Gonglja, justin\u2010tse, krahets, nuomi1, Reanon, sjinzh \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\uff09\u3002\u611f\u8c22\u4ed6\u4eec\u4ed8\u51fa\u7684\u65f6\u95f4\u4e0e\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u4eec\u786e\u4fdd\u4e86\u5404\u8bed\u8a00\u4ee3\u7801\u7684\u89c4\u8303\u4e0e\u7edf\u4e00\u3002

    GongljaC / C++ justin-tseJS / TS krahetsJava / Python nuomi1Swift ReanonGo / C sjinzhRust / Zig"},{"location":"chapter_appendix/contribution/","title":"13.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/#1321","title":"13.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/#1322","title":"13.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/#1323-docker","title":"13.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":"13.1. \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1311-vscode","title":"13.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/#1312-java","title":"13.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/#1313-cc","title":"13.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/#1314-python","title":"13.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/#1315-go","title":"13.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/#1316-javascript","title":"13.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/#1317-c","title":"13.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/#1318-swift","title":"13.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/#1319-rust","title":"13.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) {\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// \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.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// \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.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// \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.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# \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\nfor i, num in enumerate(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) {\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\nforeach (int num in nums) {\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) {\nfor (int i = 0; i < nums.Length; i++) {\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) {\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) {\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) {\nfor (int i = 0; i < index; i++) {\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) {\nint index = 0;\nwhile (head != null) {\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, prev) {\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 = 0\nfor i in range(len(list)):\ncount += 1\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 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: 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\nif index < 0 or index >= self.__size:\nraise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\nreturn self.__nums[index]\ndef set(self, num: int, index: int) -> None:\n\"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\nif index < 0 or index >= self.__size:\nraise IndexError(\"\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\"\"\"\nif index < 0 or index >= self.__size:\nraise IndexError(\"\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\"\"\"\nif index < 0 or index >= self.__size:\nraise IndexError(\"\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};\ntypedef struct myList myList;\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 {\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() {\nnums = new int[numsCapacity];\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\npublic int size() {\nreturn numsSize;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic int capacity() {\nreturn numsCapacity;\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 >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic void set(int index, int num) {\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// \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) {\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--) {\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) {\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++) {\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// \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// \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++) {\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_array_and_linkedlist/summary/#441-q-a","title":"4.4.1. \u00a0 Q & A","text":"

    \u6570\u7ec4\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5b58\u50a8\u5728\u5806\u4e0a\uff0c\u5bf9\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u5426\u6709\u5f71\u54cd\uff1f

    \u6808\u5185\u5b58\u5206\u914d\u7531\u7f16\u8bd1\u5668\u81ea\u52a8\u5b8c\u6210\uff0c\u800c\u5806\u5185\u5b58\u7531\u7a0b\u5e8f\u5458\u5728\u4ee3\u7801\u4e2d\u5206\u914d\uff08\u6ce8\u610f\uff0c\u8fd9\u91cc\u7684\u6808\u548c\u5806\u548c\u6570\u636e\u7ed3\u6784\u4e2d\u7684\u6808\u548c\u5806\u4e0d\u662f\u540c\u4e00\u6982\u5ff5\uff09\u3002

    1. \u6808\u4e0d\u7075\u6d3b\uff0c\u5206\u914d\u7684\u5185\u5b58\u5927\u5c0f\u4e0d\u53ef\u66f4\u6539\uff1b\u5806\u76f8\u5bf9\u7075\u6d3b\uff0c\u53ef\u4ee5\u52a8\u6001\u5206\u914d\u5185\u5b58\uff1b
    2. \u6808\u662f\u4e00\u5757\u6bd4\u8f83\u5c0f\u7684\u5185\u5b58\uff0c\u5bb9\u6613\u51fa\u73b0\u5185\u5b58\u4e0d\u8db3\uff1b\u5806\u5185\u5b58\u5f88\u5927\uff0c\u4f46\u662f\u7531\u4e8e\u662f\u52a8\u6001\u5206\u914d\uff0c\u5bb9\u6613\u788e\u7247\u5316\uff0c\u7ba1\u7406\u5806\u5185\u5b58\u7684\u96be\u5ea6\u66f4\u5927\u3001\u6210\u672c\u66f4\u9ad8\uff1b
    3. \u8bbf\u95ee\u6808\u6bd4\u8bbf\u95ee\u5806\u66f4\u5feb\uff0c\u56e0\u4e3a\u6808\u5185\u5b58\u8f83\u5c0f\u3001\u5bf9\u7f13\u5b58\u53cb\u597d\uff0c\u5806\u5e27\u5206\u6563\u5728\u5f88\u5927\u7684\u7a7a\u95f4\u5185\uff0c\u4f1a\u51fa\u73b0\u66f4\u591a\u7684\u7f13\u5b58\u672a\u547d\u4e2d\uff1b

    \u4e3a\u4ec0\u4e48\u6570\u7ec4\u4f1a\u5f3a\u8c03\u8981\u6c42\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u5374\u6ca1\u6709\u5f3a\u8c03\u540c\u7c7b\u578b\u5462\uff1f

    \u94fe\u8868\u7531\u7ed3\u70b9\u7ec4\u6210\uff0c\u7ed3\u70b9\u4e4b\u95f4\u7531\u6307\u9488\u8fde\u63a5\uff0c\u5404\u4e2a\u7ed3\u70b9\u53ef\u4ee5\u5b58\u50a8\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f8b\u5982 int, double, string, object \u7b49\u3002

    \u76f8\u5bf9\u5730\uff0c\u6570\u7ec4\u5143\u7d20\u5219\u5fc5\u987b\u662f\u76f8\u540c\u7c7b\u578b\u7684\uff0c\u8fd9\u6837\u624d\u80fd\u901a\u8fc7\u8ba1\u7b97\u504f\u79fb\u91cf\u6765\u83b7\u53d6\u5bf9\u5e94\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u5982\u679c\u6570\u7ec4\u540c\u65f6\u5305\u542b int \u548c long \u4e24\u79cd\u7c7b\u578b\uff0c\u5355\u4e2a\u5143\u7d20\u5206\u522b\u5360\u7528 4 bytes \u548c 8 bytes \uff0c\u90a3\u4e48\u6b64\u65f6\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5305\u542b\u4e86\u4e24\u79cd elementLength \u3002

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

    \u5220\u9664\u8282\u70b9\u540e\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8bbe\u4e3a \\(\\text{None}\\) \u5462\uff1f

    \u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u4ece\u8be5\u94fe\u8868\u7684\u89d2\u5ea6\u770b\uff0c\u4ece\u5934\u7ed3\u70b9\u904d\u5386\u5230\u5c3e\u7ed3\u70b9\u5df2\u7ecf\u9047\u4e0d\u5230 P \u4e86\u3002\u8fd9\u610f\u5473\u7740\u7ed3\u70b9 P \u5df2\u7ecf\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u4e86\uff0c\u6b64\u65f6\u7ed3\u70b9 P \u6307\u5411\u54ea\u91cc\u90fd\u4e0d\u4f1a\u5bf9\u8fd9\u6761\u94fe\u8868\u4ea7\u751f\u5f71\u54cd\u4e86\u3002

    \u4ece\u5783\u573e\u56de\u6536\u7684\u89d2\u5ea6\u770b\uff0c\u5bf9\u4e8e Java, Python, Go \u7b49\u62e5\u6709\u81ea\u52a8\u5783\u573e\u56de\u6536\u7684\u8bed\u8a00\u6765\u8bf4\uff0c\u8282\u70b9 P \u662f\u5426\u88ab\u56de\u6536\u53d6\u51b3\u4e8e\u662f\u5426\u6709\u4ecd\u5b58\u5728\u6307\u5411\u5b83\u7684\u5f15\u7528\uff0c\u800c\u4e0d\u662f P.next \u7684\u503c\u3002\u5728 C, C++ \u7b49\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u624b\u52a8\u91ca\u653e\u8282\u70b9\u5185\u5b58\u3002

    \u5728\u94fe\u8868\u4e2d\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u5220\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u67e5\u627e\u5143\u7d20\uff0c\u90a3\u4e3a\u4ec0\u4e48\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

    \u5982\u679c\u662f\u5148\u67e5\u627e\u5143\u7d20\u3001\u518d\u5220\u9664\u5143\u7d20\uff0c\u786e\u5b9e\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u94fe\u8868\u7684 \\(O(1)\\) \u589e\u5220\u7684\u4f18\u52bf\u53ef\u4ee5\u5728\u5176\u4ed6\u5e94\u7528\u4e0a\u5f97\u5230\u4f53\u73b0\u3002\u4f8b\u5982\uff0c\u53cc\u5411\u961f\u5217\u9002\u5408\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u7ef4\u62a4\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u59cb\u7ec8\u6307\u5411\u5934\u7ed3\u70b9\u3001\u5c3e\u7ed3\u70b9\uff0c\u6bcf\u6b21\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

    \u56fe\u7247\u201c\u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f\u201d\u4e2d\uff0c\u6d45\u84dd\u8272\u7684\u5b58\u50a8\u7ed3\u70b9\u6307\u9488\u662f\u5360\u7528\u4e00\u5757\u5185\u5b58\u5730\u5740\u5417\uff1f\u8fd8\u662f\u548c\u7ed3\u70b9\u503c\u5404\u5360\u4e00\u534a\u5462\uff1f

    \u6587\u4e2d\u53ea\u662f\u4e00\u4e2a\u793a\u610f\u56fe\uff0c\u53ea\u662f\u5b9a\u6027\u8868\u793a\u3002\u5b9a\u91cf\u7684\u8bdd\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u5206\u6790\uff1a

    • \u4e0d\u540c\u7c7b\u578b\u7684\u7ed3\u70b9\u503c\u5360\u7528\u7684\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int, long, double, \u6216\u8005\u662f\u7c7b\u7684\u5b9e\u4f8b\u7b49\u7b49\u3002
    • \u6307\u9488\u53d8\u91cf\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f\u6839\u636e\u6240\u4f7f\u7528\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ca\u7f16\u8bd1\u73af\u5883\u800c\u5b9a\uff0c\u5927\u591a\u4e3a 8 \u5b57\u8282\u6216 4 \u5b57\u8282\u3002

    \u5728\u5217\u8868\u672b\u5c3e\u6dfb\u52a0\u5143\u7d20\u662f\u5426\u65f6\u65f6\u523b\u523b\u90fd\u4e3a \\(O(1)\\) \uff1f

    \u5982\u679c\u6dfb\u52a0\u5143\u7d20\u65f6\u8d85\u51fa\u5217\u8868\u957f\u5ea6\uff0c\u5219\u9700\u8981\u5148\u6269\u5bb9\u5217\u8868\u518d\u6dfb\u52a0\u3002\u7cfb\u7edf\u4f1a\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u5185\u5b58\uff0c\u5e76\u5c06\u539f\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u642c\u8fd0\u8fc7\u53bb\uff0c\u8fd9\u65f6\u5019\u65f6\u95f4\u590d\u6742\u5ea6\u5c31\u4f1a\u662f \\(O(n)\\) \u3002

    \u201c\u5217\u8868\u7684\u51fa\u73b0\u5927\u5927\u63d0\u5347\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u526f\u4f5c\u7528\u662f\u4f1a\u9020\u6210\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u201d\uff0c\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u662f\u6307\u989d\u5916\u589e\u52a0\u7684\u53d8\u91cf\u5982\u5bb9\u91cf\u3001\u957f\u5ea6\u3001\u6269\u5bb9\u500d\u6570\u6240\u5360\u7684\u5185\u5b58\u5417\uff1f

    \u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u4e3b\u8981\u6709\u4e24\u65b9\u9762\u542b\u4e49\uff1a\u4e00\u65b9\u9762\uff0c\u5217\u8868\u90fd\u4f1a\u8bbe\u5b9a\u4e00\u4e2a\u521d\u59cb\u957f\u5ea6\uff0c\u6211\u4eec\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u8fd9\u4e48\u591a\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u4e3a\u4e86\u9632\u6b62\u9891\u7e41\u6269\u5bb9\uff0c\u6269\u5bb9\u4e00\u822c\u90fd\u4f1a\u4e58\u4ee5\u4e00\u4e2a\u7cfb\u6570\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u8fd9\u6837\u4e00\u6765\uff0c\u4e5f\u4f1a\u51fa\u73b0\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6ee1\u5b83\u4eec\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/","title":"12.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

    \u7ed9\u5b9a\u4e00\u4e2a\u4e8c\u53c9\u6811\uff0c\u641c\u7d22\u5e76\u8bb0\u5f55\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8fd4\u56de\u8282\u70b9\u5217\u8868\u3002

    \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_traversal_i_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\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_traversal_i_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\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_traversal_i_compact.py
    def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00\"\"\"\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_traversal_i_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\nif root == nil {\nreturn\n}\nif int(root.Val) == 7 {\n// \u8bb0\u5f55\u89e3\n*res = append(*res, root)\n}\npreOrderI(root.Left, res)\npreOrderI(root.Right, res)\n}\n
    preorder_traversal_i_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root, res) {\nif (root === null) {\nreturn;\n}\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push(root);\n}\npreOrder(root.left, res);\npreOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\nif (root === null) {\nreturn;\n}\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push(root);\n}\npreOrder(root.left, res);\npreOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.c
    [class]{}-[func]{preOrder}\n
    preorder_traversal_i_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\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_traversal_i_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\nif root.val == 7 {\n// \u8bb0\u5f55\u89e3\nres.append(root)\n}\npreOrder(root: root.left)\npreOrder(root: root.right)\n}\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n

    Fig. \u5728\u524d\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u8282\u70b9

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1211","title":"12.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

    \u4f8b\u9898\u4e8c

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

    \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_traversal_ii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\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_traversal_ii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\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_traversal_ii_compact.py
    def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c\"\"\"\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_traversal_ii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\nif root == nil {\nreturn\n}\n// \u5c1d\u8bd5\n*path = append(*path, root)\nif int(root.Val) == 7 {\n// \u8bb0\u5f55\u89e3\n*res = append(*res, *path)\n}\npreOrderII(root.Left, res, path)\npreOrderII(root.Right, res, path)\n// \u56de\u9000\n*path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_ii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(root, path, res) {\nif (root === null) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_ii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(\nroot: TreeNode | null,\npath: TreeNode[],\nres: TreeNode[][]\n): void {\nif (root === null) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_ii_compact.c
    [class]{}-[func]{preOrder}\n
    preorder_traversal_ii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\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 List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_ii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u5c1d\u8bd5\npath.append(root)\nif root.val == 7 {\n// \u8bb0\u5f55\u89e3\nres.append(path)\n}\npreOrder(root: root.left)\npreOrder(root: root.right)\n// \u56de\u9000\npath.removeLast()\n}\n
    preorder_traversal_ii_compact.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/#1212","title":"12.1.2. \u00a0 \u526a\u679d","text":"

    \u590d\u6742\u7684\u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u7ea6\u675f\u6761\u4ef6\u901a\u5e38\u53ef\u7528\u4e8e\u201c\u526a\u679d\u201d\u3002

    \u4f8b\u9898\u4e09

    \u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\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\u3002

    \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_traversal_iii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\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_traversal_iii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\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_traversal_iii_compact.py
    def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09\"\"\"\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_traversal_iii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n// \u526a\u679d\nif root == nil || root.Val == 3 {\nreturn\n}\n// \u5c1d\u8bd5\n*path = append(*path, root)\nif int(root.Val) == 7 {\n// \u8bb0\u5f55\u89e3\n*res = append(*res, *path)\n}\npreOrderIII(root.Left, res, path)\npreOrderIII(root.Right, res, path)\n// \u56de\u9000\n*path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_iii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(root, path, res) {\n// \u526a\u679d\nif (root === null || root.val === 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_iii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(\nroot: TreeNode | null,\npath: TreeNode[],\nres: TreeNode[][]\n): void {\n// \u526a\u679d\nif (root === null || root.val === 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_iii_compact.c
    [class]{}-[func]{preOrder}\n
    preorder_traversal_iii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\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 List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_iii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrder(root: TreeNode?) {\n// \u526a\u679d\nguard let root = root, root.val != 3 else {\nreturn\n}\n// \u5c1d\u8bd5\npath.append(root)\nif root.val == 7 {\n// \u8bb0\u5f55\u89e3\nres.append(path)\n}\npreOrder(root: root.left)\npreOrder(root: root.right)\n// \u56de\u9000\npath.removeLast()\n}\n
    preorder_traversal_iii_compact.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/#1213","title":"12.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/#1214","title":"12.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

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (Choice choice : choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (Choice choice : choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    def backtrack(state: State, choices: list[choice], res: list[state]) -> None:\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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif isSolution(state) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor _, choice := range choices {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (let choice of choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (let choice of choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res, numRes);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < numChoices; i++) {\n// \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, &choices[i])) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, &choices[i]);\nbacktrack(state, choices, numChoices, res, numRes);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state, &choices[i]);\n}\n}\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nforeach (Choice choice in choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif isSolution(state: state) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state: state, res: &res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices {\n// \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif isValid(state: state, choice: choice) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state: &state, choice: choice)\nbacktrack(state: &state, choices: choices, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state: &state, choice: choice)\n}\n}\n}\n
    \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 preorder_traversal_iii_template.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\uff1a\u4f8b\u9898\u4e09 */\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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\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
    preorder_traversal_iii_template.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\uff1a\u4f8b\u9898\u4e09 */\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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\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
    preorder_traversal_iii_template.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(\nstate: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09\"\"\"\n# \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\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)\n# \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\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
    preorder_traversal_iii_template.go
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\nreturn len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n*res = append(*res, *state)\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\nreturn choice != nil && choice.Val != 3\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n*state = append(*state, choice)\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n*state = (*state)[:len(*state)-1]\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif isSolution(state) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor _, choice := range *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)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\ntemp := make([]*TreeNode, 0)\ntemp = append(temp, choice.Left, choice.Right)\nbacktrackIII(state, &temp, 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
    preorder_traversal_iii_template.js
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state) {\nreturn state && state[state.length - 1]?.val === 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state, res) {\nres.push([...state]);\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\nreturn choice !== null && choice.val !== 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state, choice) {\nstate.push(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state) {\nstate.pop();\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(state, choices, 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 (const choice of 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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, [choice.left, choice.right], res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state);\n}\n}\n}\n
    preorder_traversal_iii_template.ts
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\nreturn state && state[state.length - 1]?.val === 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\nres.push([...state]);\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\nreturn choice !== null && choice.val !== 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\nstate.push(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state: TreeNode[]): void {\nstate.pop();\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(\nstate: TreeNode[],\nchoices: TreeNode[],\nres: TreeNode[][]\n): void {\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 (const choice of 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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, [choice.left, choice.right], res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state);\n}\n}\n}\n
    preorder_traversal_iii_template.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
    preorder_traversal_iii_template.cs
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state) {\nreturn state.Count != 0 && state[^1].val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\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) {\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.RemoveAt(state.Count - 1);\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nforeach (TreeNode choice in 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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, new List<TreeNode> { 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
    preorder_traversal_iii_template.swift
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n!state.isEmpty && state.last!.val == 7\n}\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\nres.append(state)\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\nchoice != nil && choice!.val != 3\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\nstate.append(choice)\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\nstate.removeLast()\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif isSolution(state: state) {\nrecordSolution(state: state, res: &res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices {\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif isValid(state: state, choice: choice) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state: &state, choice: choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state: &state, choice: choice)\n}\n}\n}\n
    preorder_traversal_iii_template.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\u3002\u5b9e\u9645\u4e0a\uff0c\u6240\u6709\u56de\u6eaf\u95ee\u9898\u90fd\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u9700\u8981\u6839\u636e\u5177\u4f53\u95ee\u9898\u6765\u5b9a\u4e49 state \u548c choices \uff0c\u5e76\u5b9e\u73b0\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u65b9\u6cd5\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1215","title":"12.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_backtracking/n_queens_problem/","title":"12.3. \u00a0 N \u7687\u540e\u95ee\u9898","text":"

    Question

    \u6839\u636e\u56fd\u9645\u8c61\u68cb\u7684\u89c4\u5219\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u51fb\u4e0e\u4e4b\u5904\u5728\u540c\u4e00\u884c\u6216\u540c\u4e00\u5217\u6216\u540c\u4e00\u659c\u7ebf\u4e0a\u7684\u68cb\u5b50\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u7687\u540e\u548c\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5bfb\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u95f4\u65e0\u6cd5\u76f8\u4e92\u653b\u51fb\u7684\u6446\u653e\u65b9\u6848\u3002

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5f53 \\(n = 4\\) \u65f6\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u4e24\u4e2a\u89e3\u3002\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\u5171\u6709 \\(n^2\\) \u4e2a\u683c\u5b50\uff0c\u7ed9\u51fa\u4e86\u6240\u6709\u7684\u9009\u62e9 choices \u3002\u5728\u9010\u4e2a\u653e\u7f6e\u7687\u540e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u68cb\u76d8\u72b6\u6001\u5728\u4e0d\u65ad\u5730\u53d8\u5316\uff0c\u6bcf\u4e2a\u65f6\u523b\u7684\u68cb\u76d8\u5c31\u662f\u72b6\u6001 state \u3002

    Fig. 4 \u7687\u540e\u95ee\u9898\u7684\u89e3

    \u672c\u9898\u5171\u6709\u4e09\u4e2a\u7ea6\u675f\u6761\u4ef6\uff1a\u591a\u4e2a\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u548c\u540c\u4e00\u5bf9\u89d2\u7ebf\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u89d2\u7ebf\u5206\u4e3a\u4e3b\u5bf9\u89d2\u7ebf \\ \u548c\u526f\u5bf9\u89d2\u7ebf / \u4e24\u79cd\u3002

    Fig. n \u7687\u540e\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6

    \u7687\u540e\u7684\u6570\u91cf\u548c\u68cb\u76d8\u7684\u884c\u6570\u90fd\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u6211\u4eec\u5bb9\u6613\u5f97\u5230\u7b2c\u4e00\u4e2a\u63a8\u8bba\uff1a\u68cb\u76d8\u6bcf\u884c\u90fd\u5141\u8bb8\u4e14\u53ea\u5141\u8bb8\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002\u8fd9\u610f\u5473\u7740\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u4ece\u7b2c\u4e00\u884c\u5f00\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\uff0c\u76f4\u81f3\u6700\u540e\u4e00\u884c\u7ed3\u675f\u3002\u6b64\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73b0\u591a\u4e2a\u7687\u540e\u7684\u6240\u6709\u641c\u7d22\u5206\u652f\u3002

    \u4e0b\u56fe\u5c55\u793a\u4e86 \\(4\\) \u7687\u540e\u95ee\u9898\u7684\u9010\u884c\u653e\u7f6e\u8fc7\u7a0b\u3002\u53d7\u7bc7\u5e45\u9650\u5236\uff0c\u4e0b\u56fe\u4ec5\u5c55\u5f00\u4e86\u7b2c\u4e00\u884c\u7684\u4e00\u4e2a\u641c\u7d22\u5206\u652f\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u4e0d\u6ee1\u8db3\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u65b9\u6848\u90fd\u526a\u679d\u4e86\u3002

    Fig. \u9010\u884c\u653e\u7f6e\u7b56\u7565

    \u4e3a\u4e86\u5b9e\u73b0\u6839\u636e\u5217\u7ea6\u675f\u526a\u679d\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5e03\u5c14\u578b\u6570\u7ec4 cols \u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u51b3\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u4eec\u901a\u8fc7 cols \u5c06\u5df2\u6709\u7687\u540e\u7684\u5217\u526a\u679d\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u52a8\u6001\u66f4\u65b0 cols \u7684\u72b6\u6001\u3002

    \u90a3\u4e48\uff0c\u5982\u4f55\u5904\u7406\u5bf9\u89d2\u7ebf\u7ea6\u675f\u5462\uff1f\u8bbe\u68cb\u76d8\u4e2d\u67d0\u4e2a\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a (row, col) \uff0c\u89c2\u5bdf\u77e9\u9635\u7684\u67d0\u6761\u4e3b\u5bf9\u89d2\u7ebf\uff0c\u6211\u4eec\u53d1\u73b0\u8be5\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u51cf\u5217\u7d22\u5f15\u76f8\u7b49\uff0c\u5373 row - col \u4e3a\u6052\u5b9a\u503c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u82e5\u4e24\u4e2a\u683c\u5b50\u6ee1\u8db3 row1 - col1 == row2 - col2 \uff0c\u5219\u8fd9\u4e24\u4e2a\u683c\u5b50\u4e00\u5b9a\u5904\u5728\u4e00\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u3002

    \u5229\u7528\u8be5\u6027\u8d28\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u4e00\u4e2a\u6570\u7ec4 diag1 \u6765\u8bb0\u5f55\u6bcf\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002\u6ce8\u610f\uff0c\\(n\\) \u7ef4\u65b9\u9635 row - col \u7684\u8303\u56f4\u662f \\([-n + 1, n - 1]\\) \uff0c\u56e0\u6b64\u5171\u6709 \\(2n - 1\\) \u6761\u4e3b\u5bf9\u89d2\u7ebf\u3002

    Fig. \u5904\u7406\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f

    \u540c\u7406\uff0c\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 row + col \u662f\u6052\u5b9a\u503c\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u540c\u6837\u7684\u65b9\u6cd5\uff0c\u501f\u52a9\u6570\u7ec4 diag2 \u6765\u5904\u7406\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u4fbf\u53ef\u4ee5\u5199\u51fa \\(n\\) \u7687\u540e\u7684\u89e3\u9898\u4ee3\u7801\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig n_queens.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\nboolean[] cols, boolean[] diags1, boolean[] diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row == n) {\nList<List<String>> copyState = new ArrayList<>();\nfor (List<String> sRow : state) {\ncopyState.add(new ArrayList<>(sRow));\n}\nres.add(copyState);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (int col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nint diag1 = row - col + n - 1;\nint diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate.get(row).set(col, \"Q\");\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate.get(row).set(col, \"#\");\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nList<List<String>> state = new ArrayList<>();\nfor (int i = 0; i < n; i++) {\nList<String> row = new ArrayList<>();\nfor (int j = 0; j < n; j++) {\nrow.add(\"#\");\n}\nstate.add(row);\n}\nboolean[] cols = new boolean[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nboolean[] diags1 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nboolean[] diags2 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nList<List<List<String>>> res = new ArrayList<>();\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\nvector<bool> &diags1, vector<bool> &diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row == n) {\nres.push_back(state);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (int col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nint diag1 = row - col + n - 1;\nint diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\";\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\";\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nvector<vector<string>> state(n, vector<string>(n, \"#\"));\nvector<bool> cols(n, false);           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nvector<bool> diags1(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvector<bool> diags2(2 * n - 1, false); // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvector<vector<vector<string>>> res;\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.py
    def backtrack(\nrow: int,\nn: int,\nstate: list[list[str]],\nres: list[list[list[str]]],\ncols: list[bool],\ndiags1: list[bool],\ndiags2: list[bool],\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e\"\"\"\n# \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n:\nres.append([list(row) for row in state])\nreturn\n# \u904d\u5386\u6240\u6709\u5217\nfor col in range(n):\n# \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\ndiag1 = row - col + n - 1\ndiag2 = row + col\n# \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif not (cols[col] or diags1[diag1] or diags2[diag2]):\n# \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\"\ncols[col] = diags1[diag1] = diags2[diag2] = True\n# \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2)\n# \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\"\ncols[col] = diags1[diag1] = diags2[diag2] = False\ndef n_queens(n: int) -> list[list[list[str]]]:\n\"\"\"\u6c42\u89e3 N \u7687\u540e\"\"\"\n# \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nstate = [[\"#\" for _ in range(n)] for _ in range(n)]\ncols = [False] * n  # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\ndiags1 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\ndiags2 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nres = []\nbacktrack(0, n, state, res, cols, diags1, diags2)\nreturn res\n
    n_queens.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n {\nnewState := make([][]string, len(*state))\nfor i, _ := range newState {\nnewState[i] = make([]string, len((*state)[0]))\ncopy(newState[i], (*state)[i])\n}\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor col := 0; col < n; col++ {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\ndiag1 := row - col + n - 1\ndiag2 := row + col\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif !((*cols)[col] || (*diags1)[diag1] || (*diags2)[diag2]) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n(*state)[row][col] = \"Q\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row+1, n, state, res, cols, diags1, diags2)\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n(*state)[row][col] = \"#\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n}\n}\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n {\nnewState := make([][]string, len(*state))\nfor i, _ := range newState {\nnewState[i] = make([]string, len((*state)[0]))\ncopy(newState[i], (*state)[i])\n}\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor col := 0; col < n; col++ {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\ndiag1 := row - col + n - 1\ndiag2 := row + col\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif !((*cols)[col] || (*diags1)[diag1] || (*diags2)[diag2]) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n(*state)[row][col] = \"Q\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row+1, n, state, res, cols, diags1, diags2)\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n(*state)[row][col] = \"#\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n}\n}\n}\nfunc nQueens(n int) [][][]string {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nstate := make([][]string, n)\nfor i := 0; i < n; i++ {\nrow := make([]string, n)\nfor i := 0; i < n; i++ {\nrow[i] = \"#\"\n}\nstate[i] = row\n}\n// \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\ncols := make([]bool, n)\ndiags1 := make([]bool, 2*n-1)\ndiags2 := make([]bool, 2*n-1)\nres := make([][][]string, 0)\nbacktrack(0, n, &state, &res, &cols, &diags1, &diags2)\nreturn res\n}\n
    n_queens.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row === n) {\nres.push(state.map((row) => row.slice()));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (let col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nconst diag1 = row - col + n - 1;\nconst diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = 'Q';\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = '#';\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nfunction nQueens(n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nconst state = Array.from({ length: n }, () => Array(n).fill('#'));\nconst cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nconst diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst res = [];\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunction backtrack(\nrow: number,\nn: number,\nstate: string[][],\nres: string[][][],\ncols: boolean[],\ndiags1: boolean[],\ndiags2: boolean[]\n): void {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row === n) {\nres.push(state.map((row) => row.slice()));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (let col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nconst diag1 = row - col + n - 1;\nconst diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = 'Q';\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = '#';\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nconst state = Array.from({ length: n }, () => Array(n).fill('#'));\nconst cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nconst diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst res: string[][][] = [];\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.c
    [class]{}-[func]{backtrack}\n[class]{}-[func]{nQueens}\n
    n_queens.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nvoid backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\nbool[] cols, bool[] diags1, bool[] diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row == n) {\nList<List<string>> copyState = new List<List<string>>();\nforeach (List<string> sRow in state) {\ncopyState.Add(new List<string>(sRow));\n}\nres.Add(copyState);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (int col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nint diag1 = row - col + n - 1;\nint diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\";\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\";\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nList<List<List<string>>> nQueens(int n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nList<List<string>> state = new List<List<string>>();\nfor (int i = 0; i < n; i++) {\nList<string> row = new List<string>();\nfor (int j = 0; j < n; j++) {\nrow.Add(\"#\");\n}\nstate.Add(row);\n}\nbool[] cols = new bool[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nbool[] diags1 = new bool[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nbool[] diags2 = new bool[2 * n - 1]; // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nList<List<List<string>>> res = new List<List<List<string>>>();\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n {\nres.append(state)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor col in 0 ..< n {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nlet diag1 = row - col + n - 1\nlet diag2 = row + col\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif !(cols[col] || diags1[diag1] || diags2[diag2]) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\"\ncols[col] = true\ndiags1[diag1] = true\ndiags2[diag2] = true\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\"\ncols[col] = false\ndiags1[diag1] = false\ndiags2[diag2] = false\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nvar state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\nvar cols = Array(repeating: false, count: n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nvar diags1 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvar diags2 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvar res: [[[String]]] = []\nbacktrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\nreturn res\n}\n
    n_queens.zig
    [class]{}-[func]{backtrack}\n[class]{}-[func]{nQueens}\n
    "},{"location":"chapter_backtracking/n_queens_problem/#1231","title":"12.3.1. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u8651\u5217\u7ea6\u675f\uff0c\u5219\u4ece\u7b2c\u4e00\u884c\u5230\u6700\u540e\u4e00\u884c\u5206\u522b\u6709 \\(n, n-1, \\cdots, 2, 1\\) \u4e2a\u9009\u62e9\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!)\\) \u3002\u5b9e\u9645\u4e0a\uff0c\u6839\u636e\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u526a\u679d\u4e5f\u80fd\u591f\u5927\u5e45\u5730\u7f29\u5c0f\u641c\u7d22\u7a7a\u95f4\uff0c\u56e0\u800c\u641c\u7d22\u6548\u7387\u5f80\u5f80\u4f18\u4e8e\u4ee5\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff0ccols , diags1 , diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/","title":"12.2. \u00a0 \u5168\u6392\u5217\u95ee\u9898","text":"

    \u5168\u6392\u5217\u95ee\u9898\u662f\u56de\u6eaf\u7b97\u6cd5\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u7684\u5b9a\u4e49\u662f\u5728\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff08\u5982\u4e00\u4e2a\u6570\u7ec4\u6216\u5b57\u7b26\u4e32\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u627e\u51fa\u8fd9\u4e2a\u96c6\u5408\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u5982\u4e0b\u8868\u6240\u793a\uff0c\u5217\u4e3e\u4e86\u51e0\u4e2a\u793a\u4f8b\u6570\u7ec4\u548c\u5176\u5bf9\u5e94\u7684\u6240\u6709\u6392\u5217\u3002

    \u8f93\u5165\u6570\u7ec4 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1221","title":"12.2.1. \u00a0 \u65e0\u91cd\u590d\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\u3002\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u4eec\u5148\u9009\u62e9 \\(1\\) \u3001\u518d\u9009\u62e9 \\(3\\) \u3001\u6700\u540e\u9009\u62e9 \\(2\\) \uff0c\u5219\u83b7\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u9500\u4e00\u4e2a\u9009\u62e9\uff0c\u4e4b\u540e\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002

    \u4ece\u56de\u6eaf\u7b97\u6cd5\u4ee3\u7801\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9009\u96c6\u5408 choices \u662f\u8f93\u5165\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72b6\u6001 state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9009\u62e9\u7684\u5143\u7d20\u3002\u6ce8\u610f\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u5141\u8bb8\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u56e0\u6b64\u5728\u904d\u5386\u9009\u62e9\u65f6\uff0c\u5e94\u5f53\u6392\u9664\u5df2\u7ecf\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u3002

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u641c\u7d22\u8fc7\u7a0b\u5c55\u5f00\u6210\u4e00\u4e2a\u9012\u5f52\u6811\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u5f53\u524d\u72b6\u6001 state \u3002\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u7ecf\u8fc7\u4e09\u8f6e\u9009\u62e9\u540e\u5230\u8fbe\u53f6\u8282\u70b9\uff0c\u6bcf\u4e2a\u53f6\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u6392\u5217\u3002

    Fig. \u5168\u6392\u5217\u7684\u9012\u5f52\u6811

    \u60f3\u6e05\u695a\u4ee5\u4e0a\u4fe1\u606f\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u4ee3\u7801\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u4e3a\u4e86\u7f29\u77ed\u4ee3\u7801\u884c\u6570\uff0c\u6211\u4eec\u4e0d\u5355\u72ec\u5b9e\u73b0\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5404\u4e2a\u51fd\u6570\uff0c\u800c\u662f\u5c06\u4ed6\u4eec\u5c55\u5f00\u5728 backtrack() \u51fd\u6570\u4e2d\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig permutations_i.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.length) {\nres.add(new ArrayList<Integer>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < choices.length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.remove(state.size() - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\nList<List<Integer>> res = new ArrayList<List<Integer>>();\nbacktrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\nreturn res;\n}\n
    permutations_i.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.size()) {\nres.push_back(state);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < choices.size(); i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.push_back(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop_back();\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\nvector<int> state;\nvector<bool> selected(nums.size(), false);\nvector<vector<int>> res;\nbacktrack(state, nums, selected, res);\nreturn res;\n}\n
    permutations_i.py
    def backtrack(\nstate: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n# \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(state) == len(choices):\nres.append(list(state))\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nfor i, choice in enumerate(choices):\n# \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\nif not selected[i]:\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = True\nstate.append(choice)\n# \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = False\nstate.pop()\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n\"\"\"\u5168\u6392\u5217 I\"\"\"\nres = []\nbacktrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\nreturn res\n
    permutations_i.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(*state) == len(*choices) {\nnewState := append([]int{}, *state...)\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor i := 0; i < len(*choices); i++ {\nchoice := (*choices)[i]\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif !(*selected)[i] {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n(*selected)[i] = true\n*state = append(*state, choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrackI(state, choices, selected, res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n(*selected)[i] = false\n*state = (*state)[:len(*state)-1]\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\nres := make([][]int, 0)\nstate := make([]int, 0)\nselected := make([]bool, len(nums))\nbacktrackI(&state, &nums, &selected, &res)\nreturn res\n}\n
    permutations_i.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\nconst res = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_i.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\nstate: number[],\nchoices: number[],\nselected: boolean[],\nres: number[][]\n): void {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\nconst res: number[][] = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_i.c
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsI}\n
    permutations_i.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.Count == choices.Length) {\nres.Add(new List<int>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < choices.Length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.Add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.RemoveAt(state.Count - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(int[] nums) {\nList<List<int>> res = new List<List<int>>();\nbacktrack(new List<int>(), nums, new bool[nums.Length], res);\nreturn res;\n}\n
    permutations_i.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif state.count == choices.count {\nres.append(state)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (i, choice) in choices.enumerated() {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif !selected[i] {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true\nstate.append(choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state: &state, choices: choices, selected: &selected, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false\nstate.removeLast()\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\nvar state: [Int] = []\nvar selected = Array(repeating: false, count: nums.count)\nvar res: [[Int]] = []\nbacktrack(state: &state, choices: nums, selected: &selected, res: &res)\nreturn res\n}\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsI}\n

    \u9700\u8981\u91cd\u70b9\u5173\u6ce8\u7684\u662f\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u5e03\u5c14\u578b\u6570\u7ec4 selected \uff0c\u5b83\u7684\u957f\u5ea6\u4e0e\u8f93\u5165\u6570\u7ec4\u957f\u5ea6\u76f8\u7b49\uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9009\u62e9\u3002\u6211\u4eec\u5229\u7528 selected \u907f\u514d\u67d0\u4e2a\u5143\u7d20\u88ab\u91cd\u590d\u9009\u62e9\uff0c\u4ece\u800c\u5b9e\u73b0\u526a\u679d\u3002

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u7b2c\u4e00\u8f6e\u9009\u62e9 1 \uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9 3 \uff0c\u7b2c\u4e09\u8f6e\u9009\u62e9 2 \uff0c\u5219\u9700\u8981\u5728\u7b2c\u4e8c\u8f6e\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f6e\u526a\u6389\u5143\u7d20 1, 3 \u7684\u5206\u652f\u3002\u4ece\u672c\u8d28\u4e0a\u7406\u89e3\uff0c\u6b64\u526a\u679d\u64cd\u4f5c\u53ef\u5c06\u641c\u7d22\u7a7a\u95f4\u5927\u5c0f\u4ece \\(O(n^n)\\) \u964d\u4f4e\u81f3 \\(O(n!)\\) \u3002

    Fig. \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

    "},{"location":"chapter_backtracking/permutations_problem/#1222","title":"12.2.2. \u00a0 \u8003\u8651\u91cd\u590d\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u590d\u7684\u6392\u5217\u3002

    \u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 1, 2]\\) \u3002\u4e3a\u4e86\u65b9\u4fbf\u533a\u5206\u4e24\u4e2a\u91cd\u590d\u7684\u5143\u7d20 \\(1\\) \uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u7b2c\u4e8c\u4e2a\u5143\u7d20\u8bb0\u4e3a \\(\\hat{1}\\) \u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u90fd\u662f\u91cd\u590d\u7684\u3002

    Fig. \u91cd\u590d\u6392\u5217

    \u90a3\u4e48\uff0c\u5982\u4f55\u53bb\u9664\u91cd\u590d\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u76f4\u63a5\u5bf9\u6392\u5217\u7ed3\u679c\u8fdb\u884c\u53bb\u91cd\u3002\u7136\u800c\uff0c\u8fd9\u6837\u505a\u4e0d\u591f\u4f18\u96c5\uff0c\u56e0\u4e3a\u751f\u6210\u91cd\u590d\u6392\u5217\u7684\u641c\u7d22\u5206\u652f\u662f\u6ca1\u6709\u5fc5\u8981\u7684\uff0c\u5e94\u5f53\u88ab\u63d0\u524d\u8bc6\u522b\u5e76\u526a\u679d\uff0c\u8fd9\u6837\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u5728\u7b2c\u4e00\u8f6e\u4e2d\uff0c\u9009\u62e9 \\(1\\) \u6216\u9009\u62e9 \\(\\hat{1}\\) \u662f\u7b49\u4ef7\u7684\uff0c\u56e0\u4e3a\u5728\u8fd9\u4e24\u4e2a\u9009\u62e9\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u590d\u7684\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5e94\u8be5\u628a \\(\\hat{1}\\) \u526a\u679d\u6389\u3002\u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(2\\) \u540e\uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u9700\u8981\u5c06\u7b2c\u4e8c\u8f6e\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

    Fig. \u91cd\u590d\u6392\u5217\u526a\u679d

    \u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u5b9e\u73b0\u5728\u67d0\u4e00\u8f6e\u9009\u62e9\u4e2d\uff0c\u591a\u4e2a\u76f8\u7b49\u7684\u5143\u7d20\u4ec5\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u56e0\u6b64\uff0c\u5728\u4e0a\u4e00\u9898\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u8003\u8651\u5728\u6bcf\u4e00\u8f6e\u9009\u62e9\u4e2d\u5f00\u542f\u4e00\u4e2a\u54c8\u5e0c\u8868 duplicated \uff0c\u7528\u4e8e\u8bb0\u5f55\u8be5\u8f6e\u4e2d\u5df2\u7ecf\u5c1d\u8bd5\u8fc7\u7684\u5143\u7d20\uff0c\u5e76\u5c06\u91cd\u590d\u5143\u7d20\u526a\u679d\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig permutations_ii.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.length) {\nres.add(new ArrayList<Integer>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nSet<Integer> duplicated = new HashSet<Integer>();\nfor (int i = 0; i < choices.length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.contains(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.remove(state.size() - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\nList<List<Integer>> res = new ArrayList<List<Integer>>();\nbacktrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\nreturn res;\n}\n
    permutations_ii.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.size()) {\nres.push_back(state);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nunordered_set<int> duplicated;\nfor (int i = 0; i < choices.size(); i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.emplace(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.push_back(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop_back();\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\nvector<int> state;\nvector<bool> selected(nums.size(), false);\nvector<vector<int>> res;\nbacktrack(state, nums, selected, res);\nreturn res;\n}\n
    permutations_ii.py
    def backtrack(\nstate: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n# \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(state) == len(choices):\nres.append(list(state))\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nduplicated = set[int]()\nfor i, choice in enumerate(choices):\n# \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif not selected[i] and choice not in duplicated:\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice)  # \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = True\nstate.append(choice)\n# \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = False\nstate.pop()\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n\"\"\"\u5168\u6392\u5217 II\"\"\"\nres = []\nbacktrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\nreturn res\n
    permutations_ii.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(*state) == len(*choices) {\nnewState := append([]int{}, *state...)\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nduplicated := make(map[int]struct{}, 0)\nfor i := 0; i < len(*choices); i++ {\nchoice := (*choices)[i]\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n// \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nduplicated[choice] = struct{}{}\n(*selected)[i] = true\n*state = append(*state, choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrackI(state, choices, selected, res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n(*selected)[i] = false\n*state = (*state)[:len(*state)-1]\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\nres := make([][]int, 0)\nstate := make([]int, 0)\nselected := make([]bool, len(nums))\nbacktrackII(&state, &nums, &selected, &res)\nreturn res\n}\n
    permutations_ii.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nconst duplicated = new Set();\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.has(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\nconst res = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_ii.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\nstate: number[],\nchoices: number[],\nselected: boolean[],\nres: number[][]\n): void {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nconst duplicated = new Set();\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.has(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\nconst res: number[][] = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_ii.c
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsII}\n
    permutations_ii.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.Count == choices.Length) {\nres.Add(new List<int>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nISet<int> duplicated = new HashSet<int>();\nfor (int i = 0; i < choices.Length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.Contains(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.Add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.Add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.RemoveAt(state.Count - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(int[] nums) {\nList<List<int>> res = new List<List<int>>();\nbacktrack(new List<int>(), nums, new bool[nums.Length], res);\nreturn res;\n}\n
    permutations_ii.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif state.count == choices.count {\nres.append(state)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nvar duplicated: Set<Int> = []\nfor (i, choice) in choices.enumerated() {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif !selected[i], !duplicated.contains(choice) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.insert(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true\nstate.append(choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state: &state, choices: choices, selected: &selected, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false\nstate.removeLast()\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\nvar state: [Int] = []\nvar selected = Array(repeating: false, count: nums.count)\nvar res: [[Int]] = []\nbacktrack(state: &state, choices: nums, selected: &selected, res: &res)\nreturn res\n}\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsII}\n

    \u6ce8\u610f\uff0c\u867d\u7136 selected \u548c duplicated \u90fd\u8d77\u5230\u526a\u679d\u7684\u4f5c\u7528\uff0c\u4f46\u4ed6\u4eec\u526a\u6389\u7684\u662f\u4e0d\u540c\u7684\u5206\u652f\uff1a

    • \u526a\u679d\u6761\u4ef6\u4e00\uff1a\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\u4e2d\u53ea\u6709\u4e00\u4e2a selected \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5f53\u524d\u72b6\u6001\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u4f5c\u7528\u662f\u907f\u514d\u67d0\u4e2a\u5143\u7d20\u5728 state \u4e2d\u91cd\u590d\u51fa\u73b0\u3002
    • \u526a\u679d\u6761\u4ef6\u4e8c\uff1a\u6bcf\u8f6e\u9009\u62e9\uff08\u5373\u6bcf\u4e2a\u5f00\u542f\u7684 backtrack \u51fd\u6570\uff09\u90fd\u5305\u542b\u4e00\u4e2a duplicated \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5728\u904d\u5386\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9009\u62e9\u8fc7\uff0c\u4f5c\u7528\u662f\u4fdd\u8bc1\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u4ee5\u907f\u514d\u4ea7\u751f\u91cd\u590d\u7684\u641c\u7d22\u5206\u652f\u3002

    \u4e0b\u56fe\u5c55\u793a\u4e86\u4e24\u4e2a\u526a\u679d\u6761\u4ef6\u7684\u751f\u6548\u8303\u56f4\u3002\u6ce8\u610f\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u9009\u62e9\uff0c\u4ece\u6839\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\u6784\u6210\u4e00\u4e2a\u6392\u5217\u3002

    Fig. \u4e24\u79cd\u526a\u679d\u6761\u4ef6\u7684\u4f5c\u7528\u8303\u56f4

    "},{"location":"chapter_backtracking/permutations_problem/#1223","title":"12.2.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u5047\u8bbe\u5143\u7d20\u4e24\u4e24\u4e4b\u95f4\u4e92\u4e0d\u76f8\u540c\uff0c\u5219 \\(n\\) \u4e2a\u5143\u7d20\u5171\u6709 \\(n!\\) \u79cd\u6392\u5217\uff08\u9636\u4e58\uff09\uff1b\u5728\u8bb0\u5f55\u7ed3\u679c\u65f6\uff0c\u9700\u8981\u590d\u5236\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5217\u8868\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u56e0\u6b64\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!n)\\) \u3002

    \u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u540c\u4e00\u65f6\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u4e2a duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u5168\u6392\u5217 I \u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5168\u6392\u5217 II \u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \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 = 0                 # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\nb = 0                 # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nnode = Node(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
    /* \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 = 0                     # O(1)\nb = [0] * 10000     # O(1)\nif n > 10:\nnums = [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 = 0\nnums = [0] * 10000\nnode = ListNode(0)\n# \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in range(n):\nc = 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// \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++) {\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.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 = [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};\ntypedef struct hashTable hashTable;\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// \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++) {\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++) {\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) {\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 = [[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// \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++) {\nList<int> tmp = new();\nfor (int j = 0; j < n; j++) {\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 = [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) {\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) {\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/summary/#241-q-a","title":"2.4.1. \u00a0 Q & A","text":"

    \u5c3e\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u5417\uff1f

    \u7406\u8bba\u4e0a\uff0c\u5c3e\u9012\u5f52\u51fd\u6570\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u88ab\u4f18\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u8fc7\u7edd\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java, Python, C++, Go, C# \u7b49\uff09 \u90fd\u4e0d\u652f\u6301\u81ea\u52a8\u4f18\u5316\u5c3e\u9012\u5f52\uff0c\u56e0\u6b64\u4e00\u822c\u6765\u8bf4\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \u3002

    \u51fd\u6570\u548c\u65b9\u6cd5\u8fd9\u4e24\u4e2a\u672f\u8bed\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f

    \u51fd\u6570\uff08function\uff09\u53ef\u4ee5\u72ec\u7acb\u88ab\u6267\u884c\uff0c\u6240\u6709\u53c2\u6570\u90fd\u4ee5\u663e\u5f0f\u4f20\u9012\u3002 \u65b9\u6cd5\uff08method\uff09\u4e0e\u4e00\u4e2a\u5bf9\u8c61\u5173\u8054\uff0c\u65b9\u6cd5\u88ab\u9690\u5f0f\u4f20\u9012\u7ed9\u8c03\u7528\u5b83\u7684\u5bf9\u8c61\uff0c\u65b9\u6cd5\u80fd\u591f\u5bf9\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u5305\u542b\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u3002

    \u56fe\u7247\u201c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u89c1\u7c7b\u578b\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\uff1f

    \u4e0d\u662f\uff0c\u8be5\u56fe\u7247\u5c55\u793a\u7684\u662f\u7a7a\u95f4\u590d\u6742\u5ea6\uff08\u5373\u589e\u957f\u8d8b\u52bf\uff09\uff0c\u800c\u4e0d\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\u3002\u6bcf\u4e2a\u66f2\u7ebf\u90fd\u5305\u542b\u4e00\u4e2a\u5e38\u6570\u9879\uff0c\u7528\u6765\u628a\u6240\u6709\u66f2\u7ebf\u7684\u53d6\u503c\u8303\u56f4\u538b\u7f29\u5230\u4e00\u4e2a\u89c6\u89c9\u8212\u9002\u7684\u8303\u56f4\u5185\u3002 \u5b9e\u9645\u4e2d\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u4e2a\u65b9\u6cd5\u7684\u201c\u5e38\u6570\u9879\u201d\u590d\u6742\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u65e0\u6cd5\u4ec5\u51ed\u590d\u6742\u5ea6\u6765\u9009\u62e9 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u4f18\u89e3\u6cd5\uff1b\u4f46\u76f8\u5bf9\u5730 \\(n = 8^5\\) \u5c31\u5f88\u597d\u9009\u4e86\uff0c\u8fd9\u662f\u590d\u6742\u5ea6\u5360\u4e3b\u5bfc\u7684\u60c5\u51b5\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 = 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 = 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 = 0\nsize = 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) {\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 = 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) {\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 = 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) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nforeach (int num in nums) {\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 = 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) {\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.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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = 0  # \u8ba1\u6570\u5668\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in range(len(nums) - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = n - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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) {\nint count = 0;  // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.Length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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.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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nvar i: i32 = @intCast(i32, nums.len ) - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = 0\nbase = 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) {\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++) {\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.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) {\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 = 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) {\nint count = 0;\nwhile (n > 1) {\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) {\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) {\nif (n <= 1) return 1;\nint count = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\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 = 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) {\nif (n == 0) return 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.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 = [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) {\nint[] nums = new int[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\nfor (int i = 0; i < nums.Length; i++) {\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) {\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.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/basic_data_types/","title":"3.2. \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

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

    • \u6574\u6570\u7c7b\u578b byte , short , int , long \uff1b
    • \u6d6e\u70b9\u6570\u7c7b\u578b float , double \uff0c\u7528\u4e8e\u8868\u793a\u5c0f\u6570\uff1b
    • \u5b57\u7b26\u7c7b\u578b char \uff0c\u7528\u4e8e\u8868\u793a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u6bcd\u3001\u6807\u70b9\u7b26\u53f7\u3001\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\uff1b
    • \u5e03\u5c14\u7c7b\u578b bool \uff0c\u7528\u4e8e\u8868\u793a\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\u5224\u65ad\uff1b

    \u6240\u6709\u57fa\u672c\u6570\u636e\u7c7b\u578b\u90fd\u4ee5\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u3002\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6211\u4eec\u5c06 \\(1\\) \u4e2a\u4e8c\u8fdb\u5236\u4f4d\u79f0\u4e3a \\(1\\) \u6bd4\u7279\uff0c\u5e76\u89c4\u5b9a \\(1\\) \u5b57\u8282\uff08byte\uff09\u7531 \\(8\\) \u6bd4\u7279\uff08bits\uff09\u7ec4\u6210\u3002\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5176\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\uff0c\u4f8b\u5982\uff1a

    • \u6574\u6570\u7c7b\u578b byte \u5360\u7528 \\(1\\) byte = \\(8\\) bits \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u4e2a\u4e0d\u540c\u7684\u6570\u5b57\uff1b
    • \u6574\u6570\u7c7b\u578b int \u5360\u7528 \\(4\\) bytes = \\(32\\) bits \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u6570\u5b57\uff1b

    \u4e0b\u8868\u5217\u4e3e\u4e86\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u3002\u6b64\u8868\u683c\u65e0\u9700\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

    \u7c7b\u578b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 byte \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 bytes \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 bytes \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 bytes \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u70b9\u6570 float 4 bytes \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0 f\\) double 8 bytes \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 bytes / 1 byte \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 byte \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    Tip

    \u5b57\u7b26\u7684\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u53d6\u51b3\u4e8e\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\uff0c\u8be6\u89c1\u300c\u5b57\u7b26\u7f16\u7801\u300d\u7ae0\u8282\u3002

    \u73b0\u4ee3\u8ba1\u7b97\u673a CPU \u901a\u5e38\u5c06 1 \u5b57\u8282\u4f5c\u4e3a\u6700\u5c0f\u5bfb\u5740\u5185\u5b58\u5355\u5143\u3002\u56e0\u6b64\uff0c\u5373\u4f7f\u8868\u793a\u5e03\u5c14\u91cf\u4ec5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u5185\u5b58\u4e2d\u901a\u5e38\u88ab\u5b58\u50a8\u4e3a 1 \u5b57\u8282\u3002

    \u90a3\u4e48\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u95f4\u6709\u4ec0\u4e48\u8054\u7cfb\u4e0e\u533a\u522b\u5462\uff1f\u6211\u4eec\u77e5\u9053\uff0c\u6570\u636e\u7ed3\u6784\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u4e0e\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u5b83\u7684\u4e3b\u8bed\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\u6570\u7ec4\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u7684\u7ebf\u6027\u7ed3\u6784\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u548c\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5b58\u50a8\u7684\u5185\u5bb9\u662f\u6574\u6570 int \u3001\u5c0f\u6570 float \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\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e0d\u540c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\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/character_encoding/","title":"3.4. \u00a0 \u5b57\u7b26\u7f16\u7801 *","text":"

    \u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6240\u6709\u6570\u636e\u90fd\u662f\u4ee5\u4e8c\u8fdb\u5236\u6570\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\uff0c\u5b57\u7b26 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u4e3a\u4e86\u8868\u793a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u5efa\u7acb\u4e00\u5957\u300c\u5b57\u7b26\u96c6\u300d\uff0c\u89c4\u5b9a\u6bcf\u4e2a\u5b57\u7b26\u548c\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u540e\uff0c\u8ba1\u7b97\u673a\u5c31\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u5b8c\u6210\u4e8c\u8fdb\u5236\u6570\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1. \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

    \u300cASCII \u7801\u300d\u662f\u6700\u65e9\u51fa\u73b0\u7684\u5b57\u7b26\u96c6\uff0c\u5168\u79f0\u4e3a\u201c\u7f8e\u56fd\u6807\u51c6\u4fe1\u606f\u4ea4\u6362\u4ee3\u7801\u201d\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u8fdb\u5236\u6570\uff08\u5373\u4e00\u4e2a\u5b57\u8282\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6700\u591a\u80fd\u591f\u8868\u793a 128 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u8fd9\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\u3001\u6570\u5b57 0-9 \u3001\u4e00\u4e9b\u6807\u70b9\u7b26\u53f7\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u7b26\uff08\u5982\u6362\u884c\u7b26\u548c\u5236\u8868\u7b26\uff09\u3002

    Fig. ASCII \u7801

    \u7136\u800c\uff0cASCII \u7801\u4ec5\u80fd\u591f\u8868\u793a\u82f1\u6587\u3002\u968f\u7740\u8ba1\u7b97\u673a\u7684\u5168\u7403\u5316\uff0c\u8bde\u751f\u4e86\u4e00\u79cd\u80fd\u591f\u8868\u793a\u66f4\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u96c6\u300cEASCII\u300d\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u7840\u4e0a\u6269\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u591f\u8868\u793a 256 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u5728\u4e16\u754c\u8303\u56f4\u5185\uff0c\u9646\u7eed\u51fa\u73b0\u4e86\u4e00\u6279\u9002\u7528\u4e8e\u4e0d\u540c\u5730\u533a\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u8fd9\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u4e2a\u5b57\u7b26\u7edf\u4e00\u4e3a ASCII \u7801\uff0c\u540e 128 \u4e2a\u5b57\u7b26\u5b9a\u4e49\u4e0d\u540c\uff0c\u4ee5\u9002\u5e94\u4e0d\u540c\u8bed\u8a00\u7684\u9700\u6c42\u3002

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2. \u00a0 GBK \u5b57\u7b26\u96c6","text":"

    \u540e\u6765\u4eba\u4eec\u53d1\u73b0\uff0cEASCII \u7801\u4ecd\u7136\u65e0\u6cd5\u6ee1\u8db3\u8bb8\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u6570\u91cf\u8981\u6c42\u3002\u4f8b\u5982\uff0c\u6c49\u5b57\u5927\u7ea6\u6709\u8fd1\u5341\u4e07\u4e2a\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u51e0\u5343\u4e2a\u3002\u4e2d\u56fd\u56fd\u5bb6\u6807\u51c6\u603b\u5c40\u4e8e 1980 \u5e74\u53d1\u5e03\u4e86\u300cGB2312\u300d\u5b57\u7b26\u96c6\uff0c\u5176\u6536\u5f55\u4e86 6763 \u4e2a\u6c49\u5b57\uff0c\u57fa\u672c\u6ee1\u8db3\u4e86\u6c49\u5b57\u7684\u8ba1\u7b97\u673a\u5904\u7406\u9700\u8981\u3002

    \u7136\u800c\uff0cGB2312 \u65e0\u6cd5\u5904\u7406\u90e8\u5206\u7684\u7f55\u89c1\u5b57\u548c\u7e41\u4f53\u5b57\u3002\u4e4b\u540e\u5728 GB2312 \u7684\u57fa\u7840\u4e0a\uff0c\u6269\u5c55\u5f97\u5230\u4e86\u300cGBK\u300d\u5b57\u7b26\u96c6\uff0c\u5b83\u5171\u6536\u5f55\u4e86 21886 \u4e2a\u6c49\u5b57\u3002\u5728 GBK \u7f16\u7801\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u7b26\u4f7f\u7528\u4e00\u4e2a\u5b57\u8282\u8868\u793a\uff0c\u6c49\u5b57\u4f7f\u7528\u4e24\u4e2a\u5b57\u8282\u8868\u793a\u3002

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3. \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

    \u968f\u7740\u8ba1\u7b97\u673a\u7684\u84ec\u52c3\u53d1\u5c55\uff0c\u5b57\u7b26\u96c6\u4e0e\u7f16\u7801\u6807\u51c6\u767e\u82b1\u9f50\u653e\uff0c\u800c\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u8fd9\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u4e49\u4e86\u7279\u5b9a\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u65e0\u6cd5\u5728\u591a\u8bed\u8a00\u73af\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u79cd\u8bed\u8a00\u4e5f\u5b58\u5728\u591a\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u5982\u679c\u4e24\u53f0\u7535\u8111\u5b89\u88c5\u7684\u662f\u4e0d\u540c\u7684\u7f16\u7801\u6807\u51c6\uff0c\u5219\u5728\u4fe1\u606f\u4f20\u9012\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

    \u90a3\u4e2a\u65f6\u4ee3\u7684\u4eba\u4eec\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u4e2a\u8db3\u591f\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c06\u4e16\u754c\u8303\u56f4\u5185\u7684\u6240\u6709\u8bed\u8a00\u548c\u7b26\u53f7\u90fd\u6536\u5f55\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u51b3\u8de8\u8bed\u8a00\u73af\u5883\u548c\u4e71\u7801\u95ee\u9898\u4e86\u5417\uff1f\u5728\u8fd9\u79cd\u60f3\u6cd5\u7684\u9a71\u52a8\u4e0b\uff0c\u4e00\u4e2a\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u5e94\u8fd0\u800c\u751f\u3002

    \u300cUnicode\u300d\u7684\u5168\u79f0\u4e3a\u201c\u7edf\u4e00\u5b57\u7b26\u7f16\u7801\u201d\uff0c\u7406\u8bba\u4e0a\u80fd\u5bb9\u7eb3\u4e00\u767e\u591a\u4e07\u4e2a\u5b57\u7b26\u3002\u5b83\u81f4\u529b\u4e8e\u5c06\u5168\u7403\u8303\u56f4\u5185\u7684\u5b57\u7b26\u7eb3\u5165\u5230\u7edf\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\u5b57\u7b26\u96c6\u6765\u5904\u7406\u548c\u663e\u793a\u5404\u79cd\u8bed\u8a00\u6587\u5b57\uff0c\u51cf\u5c11\u56e0\u4e3a\u7f16\u7801\u6807\u51c6\u4e0d\u540c\u800c\u4ea7\u751f\u7684\u4e71\u7801\u95ee\u9898\u3002

    \u81ea 1991 \u5e74\u53d1\u5e03\u4ee5\u6765\uff0cUnicode \u4e0d\u65ad\u6269\u5145\u65b0\u7684\u8bed\u8a00\u4e0e\u5b57\u7b26\u3002\u622a\u6b62 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7ecf\u5305\u542b 149186 \u4e2a\u5b57\u7b26\uff0c\u5305\u62ec\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\u3001\u7b26\u53f7\u3001\u751a\u81f3\u662f\u8868\u60c5\u7b26\u53f7\u7b49\u3002\u5728\u5e9e\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u7b26\u5360 3 \u5b57\u8282\u751a\u81f3 4 \u5b57\u8282\u3002

    Unicode \u662f\u4e00\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u672c\u8d28\u4e0a\u662f\u7ed9\u6bcf\u4e2a\u5b57\u7b26\u5206\u914d\u4e00\u4e2a\u7f16\u53f7\uff08\u79f0\u4e3a\u201c\u7801\u70b9\u201d\uff09\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u89c4\u5b9a\u5728\u8ba1\u7b97\u673a\u4e2d\u5982\u4f55\u5b58\u50a8\u8fd9\u4e9b\u5b57\u7b26\u7801\u70b9\u3002\u6211\u4eec\u4e0d\u7981\u4f1a\u95ee\uff1a\u5f53\u591a\u79cd\u957f\u5ea6\u7684 Unicode \u7801\u70b9\u540c\u65f6\u51fa\u73b0\u5728\u540c\u4e00\u4e2a\u6587\u672c\u4e2d\u65f6\uff0c\u7cfb\u7edf\u5982\u4f55\u89e3\u6790\u5b57\u7b26\uff1f\u4f8b\u5982\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u7684\u7f16\u7801\uff0c\u7cfb\u7edf\u5982\u4f55\u786e\u8ba4\u5b83\u662f\u4e00\u4e2a 2 \u5b57\u8282\u7684\u5b57\u7b26\u8fd8\u662f\u4e24\u4e2a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff1f

    \u5bf9\u4e8e\u4ee5\u4e0a\u95ee\u9898\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u6240\u6709\u5b57\u7b26\u5b58\u50a8\u4e3a\u7b49\u957f\u7684\u7f16\u7801\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff0c\u201c\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9ad8\u4f4d\u586b 0 \uff0c\u5c06\u201cHello \u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u90fd\u7f16\u7801\u4e3a 2 \u5b57\u8282\u957f\u5ea6\u3002\u8fd9\u6837\u7cfb\u7edf\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u5b57\u8282\u89e3\u6790\u4e00\u4e2a\u5b57\u7b26\uff0c\u6062\u590d\u51fa\u8fd9\u4e2a\u77ed\u8bed\u7684\u5185\u5bb9\u4e86\u3002

    Fig. Unicode \u7f16\u7801\u793a\u4f8b

    \u7136\u800c\uff0cASCII \u7801\u5df2\u7ecf\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u7f16\u7801\u82f1\u6587\u53ea\u9700\u8981 1 \u5b57\u8282\u3002\u82e5\u91c7\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u672c\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f\u5c06\u4f1a\u662f ASCII \u7f16\u7801\u4e0b\u5927\u5c0f\u7684 2 \u500d\uff0c\u975e\u5e38\u6d6a\u8d39\u5185\u5b58\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002

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

    \u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u4e3a\u56fd\u9645\u4e0a\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u79cd\u53ef\u53d8\u957f\u7684\u7f16\u7801\uff0c\u4f7f\u7528 1 \u5230 4 \u4e2a\u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6839\u636e\u5b57\u7b26\u7684\u590d\u6742\u6027\u800c\u53d8\u3002ASCII \u5b57\u7b26\u53ea\u9700\u8981 1 \u4e2a\u5b57\u8282\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u814a\u5b57\u6bcd\u9700\u8981 2 \u4e2a\u5b57\u8282\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u9700\u8981 3 \u4e2a\u5b57\u8282\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u7b26\u9700\u8981 4 \u4e2a\u5b57\u8282\u3002

    UTF-8 \u7684\u7f16\u7801\u89c4\u5219\u5e76\u4e0d\u590d\u6742\uff0c\u5206\u4e3a\u4e24\u79cd\u60c5\u51b5\uff1a

    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff0c\u5c06\u6700\u9ad8\u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \u3001\u5176\u4f59 7 \u4f4d\u8bbe\u7f6e\u4e3a Unicode \u7801\u70b9\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u7b26\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u5360\u636e\u4e86\u524d 128 \u4e2a\u7801\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cUTF-8 \u7f16\u7801\u53ef\u4ee5\u5411\u4e0b\u517c\u5bb9 ASCII \u7801\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u6765\u89e3\u6790\u5e74\u4ee3\u4e45\u8fdc\u7684 ASCII \u7801\u6587\u672c\u3002
    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a \\(n\\) \u5b57\u8282\u7684\u5b57\u7b26\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c06\u9996\u4e2a\u5b57\u8282\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \u3001\u7b2c \\(n + 1\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff1b\u4ece\u7b2c\u4e8c\u4e2a\u5b57\u8282\u5f00\u59cb\uff0c\u5c06\u6bcf\u4e2a\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \uff1b\u5176\u4f59\u6240\u6709\u4f4d\u7528\u4e8e\u586b\u5145\u5b57\u7b26\u7684 Unicode \u7801\u70b9\u3002

    \u4e0b\u56fe\u5c55\u793a\u4e86\u201cHello\u7b97\u6cd5\u201d\u5bf9\u5e94\u7684 UTF-8 \u7f16\u7801\u3002\u5c06\u6700\u9ad8 \\(n\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(1\\) \u6bd4\u8f83\u5bb9\u6613\u7406\u89e3\uff0c\u53ef\u4ee5\u5411\u7cfb\u7edf\u6307\u51fa\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(n\\) \u3002\u90a3\u4e48\uff0c\u4e3a\u4ec0\u4e48\u8981\u5c06\u5176\u4f59\u6240\u6709\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a \\(10\\) \u80fd\u591f\u8d77\u5230\u6821\u9a8c\u7b26\u7684\u4f5c\u7528\uff0c\u56e0\u4e3a\u5728 UTF-8 \u7f16\u7801\u89c4\u5219\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \u3002\u8fd9\u662f\u56e0\u4e3a\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\u7684\u6700\u9ad8\u4e00\u4f4d\u662f \\(0\\) \u3002\u5047\u8bbe\u7cfb\u7edf\u4ece\u4e00\u4e2a\u9519\u8bef\u7684\u5b57\u8282\u5f00\u59cb\u89e3\u6790\u6587\u672c\uff0c\u5b57\u8282\u5934\u90e8\u7684 \\(10\\) \u80fd\u591f\u5e2e\u52a9\u7cfb\u7edf\u5feb\u901f\u7684\u5224\u65ad\u51fa\u5f02\u5e38\u3002

    Fig. UTF-8 \u7f16\u7801\u793a\u4f8b

    \u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u89c1\u7684\u7f16\u7801\u65b9\u5f0f\u8fd8\u5305\u62ec UTF-16 \u548c UTF-32 \u3002\u5b83\u4eec\u4e3a Unicode \u5b57\u7b26\u96c6\u63d0\u4f9b\u4e86\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6cd5\u3002

    • UTF-16 \u7f16\u7801\uff1a\u4f7f\u7528 2 \u6216 4 \u4e2a\u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\u3002\u6240\u6709\u7684 ASCII \u5b57\u7b26\u548c\u5f88\u591a\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u7b26\uff0c\u90fd\u7528 2 \u4e2a\u5b57\u8282\u8868\u793a\uff1b\u5c11\u6570\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u4e2a\u5b57\u8282\u8868\u793a\u3002\u5bf9\u4e8e 2 \u5b57\u8282\u7684\u5b57\u7b26\uff0cUTF-16 \u7f16\u7801\u4e0e Unicode \u7801\u70b9\u76f8\u7b49\u3002
    • UTF-32 \u7f16\u7801\uff1a\u6bcf\u4e2a\u5b57\u7b26\u90fd\u4f7f\u7528 4 \u4e2a\u5b57\u8282\u3002\u8fd9\u610f\u5473\u7740 UTF-32 \u4f1a\u6bd4 UTF-8 \u548c UTF-16 \u66f4\u5360\u7528\u7a7a\u95f4\uff0c\u7279\u522b\u662f\u5bf9\u4e8e\u4e3b\u8981\u4f7f\u7528 ASCII \u5b57\u7b26\u7684\u6587\u672c\u3002

    \u4ece\u5b58\u50a8\u7a7a\u95f4\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u7b26\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 1 \u4e2a\u5b57\u8282\uff1b\u4f7f\u7528 UTF-16 \u7f16\u7801\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u7b26\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u4f1a\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u53ea\u9700\u8981 2 \u4e2a\u5b57\u8282\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u4e2a\u5b57\u8282\u3002\u4ece\u517c\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8bb8\u591a\u5de5\u5177\u548c\u5e93\u90fd\u4f18\u5148\u652f\u6301 UTF-8 \u3002

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5. \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801","text":"

    \u5bf9\u4e8e\u4ee5\u5f80\u7684\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff0c\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u7684\u5b57\u7b26\u4e32\u90fd\u91c7\u7528 UTF-16 \u6216 UTF-32 \u8fd9\u7c7b\u7b49\u957f\u7684\u7f16\u7801\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u7b49\u957f\u7f16\u7801\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u7b26\u4e32\u770b\u4f5c\u6570\u7ec4\u6765\u5904\u7406\uff0c\u5177\u4f53\u6765\u8bf4\uff1a

    • \u968f\u673a\u8bbf\u95ee: UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u8fdb\u884c\u968f\u673a\u8bbf\u95ee\u3002UTF-8 \u662f\u4e00\u79cd\u53d8\u957f\u7f16\u7801\uff0c\u8981\u627e\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u4ece\u5b57\u7b26\u4e32\u7684\u5f00\u59cb\u5904\u904d\u5386\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u8fd9\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u3002
    • \u5b57\u7b26\u8ba1\u6570: \u4e0e\u968f\u673a\u8bbf\u95ee\u7c7b\u4f3c\uff0c\u8ba1\u7b97 UTF-16 \u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8ba1\u7b97 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u9700\u8981\u904d\u5386\u6574\u4e2a\u5b57\u7b26\u4e32\u3002
    • \u5b57\u7b26\u4e32\u64cd\u4f5c: \u5728 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u5f88\u591a\u5b57\u7b26\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u8fde\u63a5\u3001\u63d2\u5165\u3001\u5220\u9664\u7b49\uff09\u90fd\u66f4\u5bb9\u6613\u8fdb\u884c\u3002\u5728 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\u8fdb\u884c\u8fd9\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u989d\u5916\u7684\u8ba1\u7b97\uff0c\u4ee5\u786e\u4fdd\u4e0d\u4f1a\u4ea7\u751f\u65e0\u6548\u7684 UTF-8 \u7f16\u7801\u3002

    \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6848\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5f88\u6709\u8da3\u7684\u8bdd\u9898\uff0c\u6d89\u53ca\u5230\u8bb8\u591a\u56e0\u7d20\uff1a

    • Java \u7684 String \u7c7b\u578b\u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a Java \u8bed\u8a00\u8bbe\u8ba1\u4e4b\u521d\uff0c\u4eba\u4eec\u8ba4\u4e3a 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u7b26\u3002\u7136\u800c\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u6b63\u786e\u7684\u5224\u65ad\u3002\u540e\u6765 Unicode \u89c4\u8303\u6269\u5c55\u5230\u4e86\u8d85\u8fc7 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u7b26\u73b0\u5728\u53ef\u80fd\u7531\u4e00\u5bf9 16 \u4f4d\u7684\u503c\uff08\u79f0\u4e3a\u201c\u4ee3\u7406\u5bf9\u201d\uff09\u8868\u793a\u3002
    • JavaScript \u548c TypeScript \u7684\u5b57\u7b26\u4e32\u4f7f\u7528 UTF-16 \u7f16\u7801\u7684\u539f\u56e0\u4e0e Java \u7c7b\u4f3c\u3002\u5f53 JavaScript \u8bed\u8a00\u5728 1995 \u5e74\u88ab Netscape \u516c\u53f8\u9996\u6b21\u5f15\u5165\u65f6\uff0cUnicode \u8fd8\u5904\u4e8e\u76f8\u5bf9\u65e9\u671f\u7684\u9636\u6bb5\uff0c\u90a3\u65f6\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7f16\u7801\u5c31\u8db3\u591f\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u7b26\u4e86\u3002
    • C# \u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u4e3b\u8981\u56e0\u4e3a .NET \u5e73\u53f0\u662f\u7531 Microsoft \u8bbe\u8ba1\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u672f\uff0c\u5305\u62ec Windows \u64cd\u4f5c\u7cfb\u7edf\uff0c\u90fd\u5e7f\u6cdb\u5730\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002

    \u7531\u4e8e\u4ee5\u4e0a\u7f16\u7a0b\u8bed\u8a00\u5bf9\u5b57\u7b26\u6570\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u4eec\u4e0d\u5f97\u4e0d\u91c7\u53d6\u201c\u4ee3\u7406\u5bf9\u201d\u7684\u65b9\u5f0f\u6765\u8868\u793a\u8d85\u8fc7 16 \u4f4d\u957f\u5ea6\u7684 Unicode \u5b57\u7b26\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u5f97\u5df2\u4e3a\u4e4b\u7684\u65e0\u5948\u4e4b\u4e3e\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5bf9\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e00\u4e2a\u5b57\u7b26\u53ef\u80fd\u5360\u7528 2 \u5b57\u8282\u6216 4 \u5b57\u8282\uff0c\u56e0\u6b64\u4e27\u5931\u4e86\u7b49\u957f\u7f16\u7801\u7684\u4f18\u52bf\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5904\u7406\u4ee3\u7406\u5bf9\u9700\u8981\u589e\u52a0\u989d\u5916\u4ee3\u7801\uff0c\u8fd9\u589e\u52a0\u4e86\u7f16\u7a0b\u7684\u590d\u6742\u6027\u548c Debug \u96be\u5ea6\u3002

    \u51fa\u4e8e\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u63d0\u51fa\u4e86\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6848\uff1a

    • Python 3 \u4f7f\u7528\u4e00\u79cd\u7075\u6d3b\u7684\u5b57\u7b26\u4e32\u8868\u793a\uff0c\u5b58\u50a8\u7684\u5b57\u7b26\u957f\u5ea6\u53d6\u51b3\u4e8e\u5b57\u7b26\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u7801\u70b9\u3002\u5bf9\u4e8e\u5168\u90e8\u662f ASCII \u5b57\u7b26\u7684\u5b57\u7b26\u4e32\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u4e2a\u5b57\u8282\uff1b\u5982\u679c\u5b57\u7b26\u4e32\u4e2d\u5305\u542b\u7684\u5b57\u7b26\u8d85\u51fa\u4e86 ASCII \u8303\u56f4\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8bed\u8a00\u5e73\u9762\uff08BMP\uff09\u5185\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u4e2a\u5b57\u8282\uff1b\u5982\u679c\u5b57\u7b26\u4e32\u4e2d\u6709\u8d85\u51fa BMP \u7684\u5b57\u7b26\uff0c\u90a3\u4e48\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 4 \u4e2a\u5b57\u8282\u3002
    • Go \u8bed\u8a00\u7684 string \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Go \u8bed\u8a00\u8fd8\u63d0\u4f9b\u4e86 rune \u7c7b\u578b\uff0c\u5b83\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002
    • Rust \u8bed\u8a00\u7684 str \u548c String \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u7c7b\u578b\uff0c\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8ba8\u8bba\u7684\u90fd\u662f\u5b57\u7b26\u4e32\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u8fd9\u548c\u5b57\u7b26\u4e32\u5982\u4f55\u5728\u6587\u4ef6\u4e2d\u5b58\u50a8\u6216\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u662f\u4e24\u4e2a\u4e0d\u540c\u7684\u95ee\u9898\u3002\u5728\u6587\u4ef6\u5b58\u50a8\u6216\u7f51\u7edc\u4f20\u8f93\u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u4f1a\u5c06\u5b57\u7b26\u4e32\u7f16\u7801\u4e3a UTF-8 \u683c\u5f0f\uff0c\u4ee5\u8fbe\u5230\u6700\u4f18\u7684\u517c\u5bb9\u6027\u548c\u7a7a\u95f4\u6548\u7387\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1. \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

    \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/#311","title":"3.1.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/#312","title":"3.1.2. \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u79bb\u6563","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

    \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\u56e0\u6b64\uff0c\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\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

    \u300c\u7269\u7406\u7ed3\u6784\u300d\u53cd\u6620\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\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

    \u5982\u82e5\u611f\u89c9\u7406\u89e3\u7269\u7406\u7ed3\u6784\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\u6570\u7ec4\u4e0e\u94fe\u8868\u662f\u5176\u4ed6\u6240\u6709\u6570\u636e\u7ed3\u6784\u7684\u57fa\u77f3\uff0c\u5efa\u8bae\u4f60\u6295\u5165\u66f4\u591a\u65f6\u95f4\u6df1\u5165\u4e86\u89e3\u8fd9\u4e24\u79cd\u57fa\u672c\u6570\u636e\u7ed3\u6784\u3002

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3. \u00a0 \u6570\u5b57\u7f16\u7801 *","text":"

    Note

    \u5728\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u5e26\u6709\u7684 * \u7b26\u53f7\u7684\u662f\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u65f6\u95f4\u6709\u9650\u6216\u611f\u5230\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

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1. \u00a0 \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801","text":"

    \u4ece\u4e0a\u4e00\u8282\u7684\u8868\u683c\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6240\u6709\u6574\u6570\u7c7b\u578b\u80fd\u591f\u8868\u793a\u7684\u8d1f\u6570\u90fd\u6bd4\u6b63\u6570\u591a\u4e00\u4e2a\u3002\u4f8b\u5982\uff0cbyte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \u3002\u8fd9\u4e2a\u73b0\u8c61\u6bd4\u8f83\u53cd\u76f4\u89c9\uff0c\u5b83\u7684\u5185\u5728\u539f\u56e0\u6d89\u53ca\u5230\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u76f8\u5173\u77e5\u8bc6\u3002\u5728\u5c55\u5f00\u5206\u6790\u4e4b\u524d\uff0c\u6211\u4eec\u9996\u5148\u7ed9\u51fa\u4e09\u8005\u7684\u5b9a\u4e49\uff1a

    • \u539f\u7801\uff1a\u6211\u4eec\u5c06\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6570\uff0c\\(1\\) \u8868\u793a\u8d1f\u6570\uff0c\u5176\u4f59\u4f4d\u8868\u793a\u6570\u5b57\u7684\u503c\u3002
    • \u53cd\u7801\uff1a\u6b63\u6570\u7684\u53cd\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u53cd\u7801\u662f\u5bf9\u5176\u539f\u7801\u9664\u7b26\u53f7\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
    • \u8865\u7801\uff1a\u6b63\u6570\u7684\u8865\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u8865\u7801\u662f\u5728\u5176\u53cd\u7801\u7684\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u3002

    Fig. \u539f\u7801\u3001\u53cd\u7801\u4e0e\u8865\u7801\u4e4b\u95f4\u7684\u76f8\u4e92\u8f6c\u6362

    \u663e\u7136\uff0c\u300c\u539f\u7801\u300d\u6700\u4e3a\u76f4\u89c2\uff0c\u7136\u800c\u6570\u5b57\u5374\u662f\u4ee5\u300c\u8865\u7801\u300d\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u539f\u7801\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u8d1f\u6570\u7684\u539f\u7801\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8e\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u5728\u539f\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7ed3\u679c\u662f \\(-3\\) \uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002

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

    \u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8ba1\u7b97\u673a\u5f15\u5165\u4e86\u300c\u53cd\u7801\u300d\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u5148\u5c06\u539f\u7801\u8f6c\u6362\u4e3a\u53cd\u7801\uff0c\u5e76\u5728\u53cd\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5e76\u5c06\u7ed3\u679c\u4ece\u53cd\u7801\u8f6c\u5316\u56de\u539f\u7801\uff0c\u5219\u53ef\u5f97\u5230\u6b63\u786e\u7ed3\u679c \\(-1\\) \u3002

    \\[ \\begin{aligned} & 1 + (-2) \\newline & = 0000 \\space 0001 \\space \\text{(\u539f\u7801)} + 1000 \\space 0010 \\space \\text{(\u539f\u7801)} \\newline & = 0000 \\space 0001 \\space \\text{(\u53cd\u7801)} + 1111 \\space 1101 \\space \\text{(\u53cd\u7801)} \\newline & = 1111 \\space 1110 \\space \\text{(\u53cd\u7801)} \\newline & = 1000 \\space 0001 \\space \\text{(\u539f\u7801)} \\newline & = -1 \\end{aligned} \\]

    \u53e6\u4e00\u65b9\u9762\uff0c\u6570\u5b57\u96f6\u7684\u539f\u7801\u6709 \\(+0\\) \u548c \\(-0\\) \u4e24\u79cd\u8868\u793a\u65b9\u5f0f\u3002\u8fd9\u610f\u5473\u7740\u6570\u5b57\u96f6\u5bf9\u5e94\u7740\u4e24\u4e2a\u4e0d\u540c\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\uff0c\u800c\u8fd9\u53ef\u80fd\u4f1a\u5e26\u6765\u6b67\u4e49\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u5728\u6761\u4ef6\u5224\u65ad\u4e2d\uff0c\u5982\u679c\u6ca1\u6709\u533a\u5206\u6b63\u96f6\u548c\u8d1f\u96f6\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u9519\u8bef\u7684\u5224\u65ad\u7ed3\u679c\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\u5904\u7406\u6b63\u96f6\u548c\u8d1f\u96f6\u6b67\u4e49\uff0c\u5219\u9700\u8981\u5f15\u5165\u989d\u5916\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u5176\u53ef\u80fd\u4f1a\u964d\u4f4e\u8ba1\u7b97\u673a\u7684\u8fd0\u7b97\u6548\u7387\u3002

    \\[ \\begin{aligned} +0 & = 0000 \\space 0000 \\newline -0 & = 1000 \\space 0000 \\end{aligned} \\]

    \u4e0e\u539f\u7801\u4e00\u6837\uff0c\u53cd\u7801\u4e5f\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\u3002\u4e3a\u6b64\uff0c\u8ba1\u7b97\u673a\u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u300c\u8865\u7801\u300d\u3002\u90a3\u4e48\uff0c\u8865\u7801\u6709\u4ec0\u4e48\u4f5c\u7528\u5462\uff1f\u6211\u4eec\u5148\u6765\u5206\u6790\u4e00\u4e0b\u8d1f\u96f6\u7684\u8865\u7801\u7684\u8ba1\u7b97\u8fc7\u7a0b\uff1a

    \\[ \\begin{aligned} -0 = \\space & 1000 \\space 0000 \\space \\text{(\u539f\u7801)} \\newline = \\space & 1111 \\space 1111 \\space \\text{(\u53cd\u7801)} \\newline = 1 \\space & 0000 \\space 0000 \\space \\text{(\u8865\u7801)} \\newline \\end{aligned} \\]

    \u5728\u8d1f\u96f6\u7684\u53cd\u7801\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u4f1a\u4ea7\u751f\u8fdb\u4f4d\uff0c\u800c\u7531\u4e8e byte \u7684\u957f\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u51fa\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u4f1a\u88ab\u820d\u5f03\u3002\u4ece\u800c\u5f97\u5230\u8d1f\u96f6\u7684\u8865\u7801\u4e3a \\(0000 \\space 0000\\) \uff0c\u4e0e\u6b63\u96f6\u7684\u8865\u7801\u76f8\u540c\u3002\u8fd9\u610f\u5473\u7740\u5728\u8865\u7801\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u4e2a\u96f6\uff0c\u4ece\u800c\u89e3\u51b3\u4e86\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\u3002

    \u8fd8\u5269\u4f59\u6700\u540e\u4e00\u4e2a\u7591\u60d1\uff1abyte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u8d1f\u6570 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u4eec\u6ce8\u610f\u5230\uff0c\u533a\u95f4 \\([-127, +127]\\) \u5185\u7684\u6240\u6709\u6574\u6570\u90fd\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\uff0c\u5e76\u4e14\u539f\u7801\u548c\u8865\u7801\u4e4b\u95f4\u662f\u53ef\u4ee5\u4e92\u76f8\u8f6c\u6362\u7684\u3002

    \u7136\u800c\uff0c\u8865\u7801 \\(1000 \\space 0000\\) \u662f\u4e00\u4e2a\u4f8b\u5916\uff0c\u5b83\u5e76\u6ca1\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3002\u6839\u636e\u8f6c\u6362\u65b9\u6cd5\uff0c\u6211\u4eec\u5f97\u5230\u8be5\u8865\u7801\u7684\u539f\u7801\u4e3a \\(0000 \\space 0000\\) \u3002\u8fd9\u663e\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u4e3a\u8be5\u539f\u7801\u8868\u793a\u6570\u5b57 \\(0\\) \uff0c\u5b83\u7684\u8865\u7801\u5e94\u8be5\u662f\u81ea\u8eab\u3002\u8ba1\u7b97\u673a\u89c4\u5b9a\u8fd9\u4e2a\u7279\u6b8a\u7684\u8865\u7801 \\(1000 \\space 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5b9e\u9645\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u8865\u7801\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u5c31\u662f \\(-128\\) \u3002

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & = 1111 \\space 1111 \\space \\text{(\u539f\u7801)} + 1000 \\space 0001 \\space \\text{(\u539f\u7801)} \\newline & = 1000 \\space 0000 \\space \\text{(\u53cd\u7801)} + 1111 \\space 1110 \\space \\text{(\u53cd\u7801)} \\newline & = 1000 \\space 0001 \\space \\text{(\u8865\u7801)} + 1111 \\space 1111 \\space \\text{(\u8865\u7801)} \\newline & = 1000 \\space 0000 \\space \\text{(\u8865\u7801)} \\newline & = -128 \\end{aligned} \\]

    \u4f60\u53ef\u80fd\u5df2\u7ecf\u53d1\u73b0\uff0c\u4e0a\u8ff0\u7684\u6240\u6709\u8ba1\u7b97\u90fd\u662f\u52a0\u6cd5\u8fd0\u7b97\u3002\u8fd9\u6697\u793a\u7740\u4e00\u4e2a\u91cd\u8981\u4e8b\u5b9e\uff1a\u8ba1\u7b97\u673a\u5185\u90e8\u7684\u786c\u4ef6\u7535\u8def\u4e3b\u8981\u662f\u57fa\u4e8e\u52a0\u6cd5\u8fd0\u7b97\u8bbe\u8ba1\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u52a0\u6cd5\u8fd0\u7b97\u76f8\u5bf9\u4e8e\u5176\u4ed6\u8fd0\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u51cf\u6cd5\uff09\u6765\u8bf4\uff0c\u786c\u4ef6\u5b9e\u73b0\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u66f4\u5bb9\u6613\u8fdb\u884c\u5e76\u884c\u5316\u5904\u7406\uff0c\u4ece\u800c\u63d0\u9ad8\u8fd0\u7b97\u901f\u5ea6\u3002

    \u7136\u800c\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8ba1\u7b97\u673a\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u901a\u8fc7\u5c06\u52a0\u6cd5\u4e0e\u4e00\u4e9b\u57fa\u672c\u903b\u8f91\u8fd0\u7b97\u7ed3\u5408\uff0c\u8ba1\u7b97\u673a\u80fd\u591f\u5b9e\u73b0\u5404\u79cd\u5176\u4ed6\u7684\u6570\u5b66\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u8ba1\u7b97\u51cf\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8ba1\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u51cf\u6cd5\u3002

    \u73b0\u5728\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u8ba1\u7b97\u673a\u4f7f\u7528\u8865\u7801\u7684\u539f\u56e0\uff1a\u57fa\u4e8e\u8865\u7801\u8868\u793a\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u7535\u8def\u548c\u64cd\u4f5c\u6765\u5904\u7406\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\u6765\u5904\u7406\u51cf\u6cd5\uff0c\u5e76\u4e14\u65e0\u9700\u7279\u522b\u5904\u7406\u6b63\u8d1f\u96f6\u7684\u6b67\u4e49\u95ee\u9898\u3002\u8fd9\u5927\u5927\u7b80\u5316\u4e86\u786c\u4ef6\u8bbe\u8ba1\uff0c\u5e76\u63d0\u9ad8\u4e86\u8fd0\u7b97\u6548\u7387\u3002

    \u8865\u7801\u7684\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\uff0c\u7531\u4e8e\u7bc7\u5e45\u5173\u7cfb\u6211\u4eec\u5148\u4ecb\u7ecd\u5230\u8fd9\u91cc\u3002\u5efa\u8bae\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8fdb\u4e00\u6b65\u6df1\u5ea6\u4e86\u89e3\u3002

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2. \u00a0 \u6d6e\u70b9\u6570\u7f16\u7801","text":"

    \u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 bytes\uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\u8fd9\u975e\u5e38\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u6309\u7406\u8bf4 float \u9700\u8981\u8868\u793a\u5c0f\u6570\uff0c\u53d6\u503c\u8303\u56f4\u5e94\u8be5\u53d8\u5c0f\u624d\u5bf9\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u56e0\u4e3a\u6d6e\u70b9\u6570 float \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\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/summary/","title":"3.5. \u00a0 \u5c0f\u7ed3","text":"

    \u6570\u636e\u7ed3\u6784\u5206\u7c7b

    • \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
    • \u5f53\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u88ab\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u3002\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u62e5\u6709\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\uff0c\u7a0b\u5e8f\u901a\u8fc7\u8fd9\u4e9b\u5185\u5b58\u5730\u5740\u8bbf\u95ee\u6570\u636e\u3002
    • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\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

    \u6570\u636e\u7c7b\u578b\u4e0e\u7f16\u7801

    • \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 \u3002\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
    • \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7f16\u7801\u6570\u5b57\u7684\u4e09\u79cd\u65b9\u6cd5\uff0c\u5b83\u4eec\u4e4b\u95f4\u662f\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\u7684\u3002\u6574\u6570\u7684\u539f\u7801\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u53f7\u4f4d\uff0c\u5176\u4f59\u4f4d\u662f\u6570\u5b57\u7684\u503c\u3002
    • \u6574\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u662f\u4ee5\u8865\u7801\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\u3002\u5728\u8865\u7801\u8868\u793a\u4e0b\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u5bf9\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\u4e00\u89c6\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u4e3a\u51cf\u6cd5\u64cd\u4f5c\u5355\u72ec\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\uff0c\u5e76\u4e14\u4e0d\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u7684\u95ee\u9898\u3002
    • \u6d6e\u70b9\u6570\u7684\u7f16\u7801\u7531 1 \u4f4d\u7b26\u53f7\u4f4d\u30018 \u4f4d\u6307\u6570\u4f4d\u548c 23 \u4f4d\u5206\u6570\u4f4d\u6784\u6210\u3002\u7531\u4e8e\u5b58\u5728\u6307\u6570\u4f4d\uff0c\u6d6e\u70b9\u6570\u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e\u6574\u6570\uff0c\u4ee3\u4ef7\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002
    • ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u957f\u5ea6\u4e3a 1 \u5b57\u8282\uff0c\u5171\u6536\u5f55 127 \u4e2a\u5b57\u7b26\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u5f55\u4e24\u4e07\u591a\u4e2a\u6c49\u5b57\u3002Unicode \u81f4\u529b\u4e8e\u63d0\u4f9b\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u6536\u5f55\u4e16\u754c\u5185\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u4ece\u800c\u89e3\u51b3\u7531\u4e8e\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5bfc\u81f4\u7684\u4e71\u7801\u95ee\u9898\u3002
    • UTF-8 \u662f\u6700\u53d7\u6b22\u8fce\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u79cd\u53d8\u957f\u7684\u7f16\u7801\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u6269\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5b58\u50a8\u7a7a\u95f4\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u957f\u7684\u7f16\u7801\u65b9\u6cd5\u3002\u5728\u7f16\u7801\u4e2d\u6587\u65f6\uff0cUTF-16 \u6bd4 UTF-8 \u7684\u5360\u7528\u7a7a\u95f4\u66f4\u5c0f\u3002Java, C# \u7b49\u7f16\u7a0b\u8bed\u8a00\u9ed8\u8ba4\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002
    "},{"location":"chapter_data_structure/summary/#351-q-a","title":"3.5.1. \u00a0 Q & A","text":"

    \u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1f

    \u54c8\u5e0c\u8868\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u800c\u4e3a\u4e86\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u4f7f\u7528\u201c\u62c9\u94fe\u6cd5\u201d\uff08\u540e\u7eed\u6563\u5217\u8868\u7ae0\u8282\u4f1a\u8bb2\uff09\u3002\u5728\u62c9\u94fe\u6cd5\u4e2d\uff0c\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5730\u5740\uff08\u6876\uff09\u6307\u5411\u4e00\u4e2a\u94fe\u8868\uff1b\u5f53\u8fd9\u4e2a\u94fe\u8868\u957f\u5ea6\u8d85\u8fc7\u4e00\u5b9a\u9608\u503c\u65f6\uff0c\u53c8\u53ef\u80fd\u88ab\u8f6c\u5316\u4e3a\u6811\uff08\u901a\u5e38\u4e3a\u7ea2\u9ed1\u6811\uff09\u3002\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\uff08\u6570\u7ec4\u3001\u94fe\u8868\uff09\u548c\u975e\u7ebf\u6027\uff08\u6811\uff09\u6570\u636e\u7ed3\u6784\u3002

    char \u7c7b\u578b\u7684\u957f\u5ea6\u662f 1 bytes \u5417\uff1f

    \u8fd9\u4e2a\u4e0e\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u7f16\u7801\u65b9\u6cd5\u6709\u5173\u3002\u4f8b\u5982\uff0cJava, JS, TS, C# \u90fd\u91c7\u7528 UTF-16 \u7f16\u7801\uff08\u4fdd\u5b58 Unicode \u7801\u70b9\uff09\uff0c\u56e0\u6b64 char \u7c7b\u578b\u7684\u957f\u5ea6\u4e3a 2 bytes \u3002

    "},{"location":"chapter_graph/graph/","title":"9.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/#911","title":"9.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/#912","title":"9.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/#913","title":"9.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/#914","title":"9.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":"9.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/#921","title":"9.2.1. \u00a0 \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u7684\u5b9e\u73b0","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \u7684\u65e0\u5411\u56fe\uff0c\u5219\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 {\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) {\nthis.vertices = new List<int>();\nthis.adjMat = new List<List<int>>();\n// \u6dfb\u52a0\u9876\u70b9\nforeach (int val in 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\nforeach (int[] e in edges) {\naddEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size() {\nreturn vertices.Count;\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<int> newRow = new List<int>(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\nforeach (List<int> row in adjMat) {\nrow.Add(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(int index) {\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) {\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// \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// \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() {\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/#922","title":"9.2.2. \u00a0 \u57fa\u4e8e\u90bb\u63a5\u8868\u7684\u5b9e\u73b0","text":"

    \u8bbe\u65e0\u5411\u56fe\u7684\u9876\u70b9\u603b\u6570\u4e3a \\(n\\) \u3001\u8fb9\u603b\u6570\u4e3a \\(m\\) \uff0c\u5219\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(n + m)\\) \u65f6\u95f4\u3002
    • \u521d\u59cb\u5316\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u521b\u5efa \\(n\\) \u4e2a\u9876\u70b9\u548c \\(2m\\) \u6761\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
    \u521d\u59cb\u5316\u90bb\u63a5\u8868\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

    \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// \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) {\nthis.adjList = new Dictionary<Vertex, List<Vertex>>();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nforeach (Vertex[] edge in 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.Count;\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic void addEdge(Vertex vet1, Vertex vet2) {\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) {\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) {\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) {\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) {\nlist.Remove(vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic void print() {\nConsole.WriteLine(\"\u90bb\u63a5\u8868 =\");\nforeach (KeyValuePair<Vertex, List<Vertex>> entry in adjList) {\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/#923","title":"9.2.3. \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

    \u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\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":"9.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/#931","title":"9.3.1. \u00a0 \u5e7f\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u4ece\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// \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) {\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]) {\nif (visited.Contains(adjVet)) {\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/#932","title":"9.3.2. \u00a0 \u6df1\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u518d\u56de\u5934\u7684\u904d\u5386\u65b9\u5f0f\u3002\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) {\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]) {\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, 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 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":"9.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_graph/summary/#941-q-a","title":"9.4.1. \u00a0 Q & A","text":"

    \u8def\u5f84\u7684\u5b9a\u4e49\u662f\u9876\u70b9\u5e8f\u5217\u8fd8\u662f\u8fb9\u5e8f\u5217\uff1f

    \u7ef4\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8bed\u8a00\u7248\u672c\u7684\u5b9a\u4e49\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices. \u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f84\u88ab\u8ba4\u4e3a\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u3002\u8fd9\u662f\u56e0\u4e3a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u53ef\u80fd\u5b58\u5728\u591a\u6761\u8fb9\u8fde\u63a5\uff0c\u6b64\u65f6\u6bcf\u6761\u8fb9\u90fd\u5bf9\u5e94\u4e00\u6761\u8def\u5f84\u3002

    \u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u662f\u5426\u4f1a\u6709\u65e0\u6cd5\u904d\u5386\u5230\u7684\u70b9\uff1f

    \u5728\u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002\u904d\u5386\u975e\u8fde\u901a\u56fe\u9700\u8981\u8bbe\u7f6e\u591a\u4e2a\u8d77\u70b9\uff0c\u4ee5\u904d\u5386\u5230\u56fe\u7684\u6240\u6709\u8fde\u901a\u5206\u91cf\u3002

    \u5728\u90bb\u63a5\u8868\u4e2d\uff0c\u201c\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u6240\u6709\u9876\u70b9\u201d\u7684\u9876\u70b9\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

    \u53ef\u4ee5\u662f\u4efb\u610f\u987a\u5e8f\u3002\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u53ef\u80fd\u4f1a\u9700\u8981\u6309\u7167\u6307\u5b9a\u89c4\u5219\u6765\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9876\u70b9\u6dfb\u52a0\u7684\u6b21\u5e8f\u3001\u6216\u8005\u6309\u7167\u9876\u70b9\u503c\u5927\u5c0f\u7684\u987a\u5e8f\u7b49\u7b49\uff0c\u8fd9\u6837\u53ef\u4ee5\u6709\u52a9\u4e8e\u5feb\u901f\u67e5\u627e\u201c\u5e26\u6709\u67d0\u79cd\u6781\u503c\u201d\u7684\u9876\u70b9\u3002

    "},{"location":"chapter_hashing/hash_collision/","title":"6.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/#621","title":"6.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/#622","title":"6.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/#623","title":"6.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\u8fbe\u5230 64 \u4e14\u94fe\u8868\u957f\u5ea6\u8fbe\u5230 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u88ab\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\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":"6.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/#611","title":"6.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/#612","title":"6.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 \\bmod {100} \\]

    \u5176\u4e2d \\(\\bmod\\) \u8868\u793a\u53d6\u4f59\u8fd0\u7b97\u3002

    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 = 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 = []\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 = []\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 {\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();\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[index];\nif (pair == null) return 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[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[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic List<Entry> entrySet() {\nList<Entry> entrySet = new();\nforeach (Entry? pair in buckets) {\nif (pair != null)\nentrySet.Add(pair);\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic List<int> keySet() {\nList<int> keySet = new();\nforeach (Entry? pair in 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();\nforeach (Entry? pair in buckets) {\nif (pair != null)\nvalueSet.Add(pair.val);\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic void print() {\nforeach (Entry kv in entrySet()) {\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/#613","title":"6.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 \\bmod 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":"6.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":"8.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/#821","title":"8.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/#822","title":"8.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// \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--) {\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/#823","title":"8.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":"8.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/#811","title":"8.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/#812","title":"8.1.2. \u00a0 \u5806\u7684\u5b9e\u73b0","text":"

    \u4e0b\u6587\u5b9e\u73b0\u7684\u662f\u5927\u9876\u5806\u3002\u82e5\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u5c0f\u9876\u5806\uff0c\u53ea\u9700\u5c06\u6240\u6709\u5927\u5c0f\u903b\u8f91\u5224\u65ad\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) {\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.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() {\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><7><8><9>

    \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// \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// \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 IndexOutOfBoundsException();\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\nif self.is_empty():\nraise IndexError(\"\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\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// \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) {\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[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/#813","title":"8.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\u4e0d\u65ad\u5730\u6267\u884c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u6570\u636e\u3002\u7136\u800c\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u4f7f\u7528\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u5806\u6392\u5e8f\uff0c\u8be6\u89c1\u540e\u7eed\u7684\u5806\u6392\u5e8f\u7ae0\u8282\u3002
    • \u83b7\u53d6\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff1a\u8fd9\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u7b97\u6cd5\u95ee\u9898\uff0c\u540c\u65f6\u4e5f\u662f\u4e00\u79cd\u5178\u578b\u5e94\u7528\uff0c\u4f8b\u5982\u9009\u62e9\u70ed\u5ea6\u524d 10 \u7684\u65b0\u95fb\u4f5c\u4e3a\u5fae\u535a\u70ed\u641c\uff0c\u9009\u53d6\u9500\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
    "},{"location":"chapter_heap/summary/","title":"8.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

    Fig. \u62fc\u88c5\u79ef\u6728

    \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\u5982\u679c\u5df2\u6709\u4e00\u5b9a\u57fa\u7840\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u60a8\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u4e66\u5185\u6e90\u4ee3\u7801\u4e5f\u53ef\u4f5c\u4e3a\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u4f7f\u7528\u3002
    • \u4e66\u4e2d\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u590d\u6742\u5ea6\u5206\u6790\u3001\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u5927\u90e8\u5206\u4e3b\u9898\u3002
    • \u5bf9\u4e8e\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b66\u9636\u6bb5\u9605\u8bfb\u4e00\u672c\u5165\u95e8\u4e66\u7c4d\u81f3\u5173\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8bb8\u591a\u5f2f\u8def\u3002
    • \u4e66\u5185\u7684\u52a8\u753b\u548c\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u3002\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5e94\u7ed9\u4e88\u8fd9\u4e9b\u5185\u5bb9\u66f4\u591a\u5173\u6ce8\u3002
    • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\u3002\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u6253\u4ee3\u7801\u3002
    • \u672c\u4e66\u7f51\u9875\u7248\u7684\u6bcf\u4e2a\u7ae0\u8282\u90fd\u8bbe\u6709\u8ba8\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\u4e0e\u89c1\u89e3\u3002
    "},{"location":"chapter_reference/","title":"\u53c2\u8003\u6587\u732e","text":"

    [1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

    [2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

    [3] \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/binary_search/","title":"10.1. \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

    \u300c\u4e8c\u5206\u67e5\u627e Binary Search\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u601d\u60f3\u7684\u9ad8\u6548\u641c\u7d22\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f6e\u51cf\u5c11\u4e00\u534a\u641c\u7d22\u8303\u56f4\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u4e3a\u6b62\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\uff0c\u6570\u7ec4\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u8be5\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    \u5bf9\u4e8e\u4e0a\u8ff0\u95ee\u9898\uff0c\u6211\u4eec\u5148\u521d\u59cb\u5316\u6307\u9488 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u7d22\u533a\u95f4 \\([0, n - 1]\\) \u3002\u5176\u4e2d\uff0c\u4e2d\u62ec\u53f7\u8868\u793a\u201c\u95ed\u533a\u95f4\u201d\uff0c\u5373\u5305\u542b\u8fb9\u754c\u503c\u672c\u8eab\u3002

    \u63a5\u4e0b\u6765\uff0c\u5faa\u73af\u6267\u884c\u4ee5\u4e0b\u4e24\u4e2a\u6b65\u9aa4\uff1a

    1. \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\space \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
    2. \u5224\u65ad nums[m] \u548c target \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4e09\u79cd\u60c5\u51b5\uff1a
      1. \u5f53 nums[m] < target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(i = m + 1\\) \uff1b
      2. \u5f53 nums[m] > target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(j = m - 1\\) \uff1b
      3. \u5f53 nums[m] = target \u65f6\uff0c\u8bf4\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \uff1b

    \u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20\uff0c\u641c\u7d22\u533a\u95f4\u6700\u7ec8\u4f1a\u7f29\u5c0f\u4e3a\u7a7a\u3002\u6b64\u65f6\u8fd4\u56de \\(-1\\) \u3002

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

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u7c7b\u578b\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u4e3a\u4e86\u907f\u514d\u5927\u6570\u8d8a\u754c\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u6765\u8ba1\u7b97\u4e2d\u70b9\u3002

    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 - i) / 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 - i) / 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\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# \u7406\u8bba\u4e0a Python \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u9700\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:\ni = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelif nums[m] > target:\nj = m - 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\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-i)/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 - i) / 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 - i) / 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 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\nint i = 0, j = len - 1;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\nwhile (i <= j) {\nint m = i + (j - i) / 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.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target) {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\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 - i) / 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 - i) / 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 - i) / 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

    \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\u533a\u95f4\uff0c\u56e0\u6b64\u4e8c\u5206\u5faa\u73af\u6b21\u6570\u4e3a \\(\\log_2 n\\) \u3002

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

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1. \u00a0 \u533a\u95f4\u8868\u793a\u65b9\u6cd5","text":"

    \u9664\u4e86\u4e0a\u8ff0\u7684\u53cc\u95ed\u533a\u95f4\u5916\uff0c\u5e38\u89c1\u7684\u533a\u95f4\u8868\u793a\u8fd8\u6709\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u533a\u95f4\uff0c\u5b9a\u4e49\u4e3a \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8be5\u8868\u793a\u4e0b\uff0c\u533a\u95f4 \\([i, j]\\) \u5728 \\(i = j\\) \u65f6\u4e3a\u7a7a\u3002

    \u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u8be5\u8868\u793a\u5b9e\u73b0\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search.java
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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_search_lcro(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:\ni = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\nelif nums[m] > target:\nj = m  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\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\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunc binarySearchLCRO(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-i)/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 binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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 binarySearchLCRO(int *nums, int len, 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 = 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) {\nint m = i + (j - i) / 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.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5728\u4e24\u79cd\u533a\u95f4\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u5faa\u73af\u6761\u4ef6\u548c\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

    \u5728\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u6cd5\u4e2d\uff0c\u7531\u4e8e\u5de6\u53f3\u8fb9\u754c\u90fd\u88ab\u5b9a\u4e49\u4e3a\u95ed\u533a\u95f4\uff0c\u56e0\u6b64\u6307\u9488 \\(i\\) \u548c \\(j\\) \u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

    Fig. \u4e24\u79cd\u533a\u95f4\u5b9a\u4e49

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2. \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u4e8c\u5206\u67e5\u627e\u5728\u65f6\u95f4\u548c\u7a7a\u95f4\u65b9\u9762\u90fd\u6709\u8f83\u597d\u7684\u6027\u80fd\uff1a

    • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u6548\u7387\u9ad8\u3002\u5728\u5927\u6570\u636e\u91cf\u4e0b\uff0c\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5177\u6709\u663e\u8457\u4f18\u52bf\u3002\u4f8b\u5982\uff0c\u5f53\u6570\u636e\u5927\u5c0f \\(n = 2^{20}\\) \u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u9700\u8981 \\(2^{20} = 1048576\\) \u8f6e\u5faa\u73af\uff0c\u800c\u4e8c\u5206\u67e5\u627e\u4ec5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f6e\u5faa\u73af\u3002
    • \u4e8c\u5206\u67e5\u627e\u65e0\u9700\u989d\u5916\u7a7a\u95f4\u3002\u76f8\u8f83\u4e8e\u9700\u8981\u501f\u52a9\u989d\u5916\u7a7a\u95f4\u7684\u641c\u7d22\u7b97\u6cd5\uff08\u4f8b\u5982\u54c8\u5e0c\u67e5\u627e\uff09\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

    \u7136\u800c\uff0c\u4e8c\u5206\u67e5\u627e\u5e76\u975e\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\uff0c\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_searching/binary_search_edge/","title":"10.2. \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c","text":"

    \u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u9898\u76ee\u89c4\u5b9a\u6570\u7ec4\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\u3002\u5982\u679c\u76ee\u6807\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u591a\u6b21\u51fa\u73b0\uff0c\u4e0a\u8282\u4ecb\u7ecd\u7684\u65b9\u6cd5\u53ea\u80fd\u4fdd\u8bc1\u8fd4\u56de\u5176\u4e2d\u4e00\u4e2a\u76ee\u6807\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u800c\u65e0\u6cd5\u786e\u5b9a\u8be5\u7d22\u5f15\u7684\u5de6\u8fb9\u548c\u53f3\u8fb9\u8fd8\u6709\u591a\u5c11\u76ee\u6807\u5143\u7d20\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u6570\u7ec4\u4e2d\u9996\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    "},{"location":"chapter_searching/binary_search_edge/#1021","title":"10.2.1. \u00a0 \u7b80\u5355\u65b9\u6cd5","text":"

    \u4e3a\u4e86\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5de6\u8fb9\u7684 target \uff0c\u6211\u4eec\u53ef\u4ee5\u5206\u4e3a\u4e24\u6b65\uff1a

    1. \u8fdb\u884c\u4e8c\u5206\u67e5\u627e\uff0c\u5b9a\u4f4d\u5230\u4efb\u610f\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\(k\\) \uff1b
    2. \u4ee5\u7d22\u5f15 \\(k\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u5411\u5de6\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u627e\u5230\u6700\u5de6\u8fb9\u7684 target \u8fd4\u56de\u5373\u53ef\u3002

    Fig. \u7ebf\u6027\u67e5\u627e\u6700\u5de6\u8fb9\u7684\u5143\u7d20

    \u8fd9\u4e2a\u65b9\u6cd5\u867d\u7136\u6709\u6548\uff0c\u4f46\u7531\u4e8e\u5305\u542b\u7ebf\u6027\u67e5\u627e\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u80fd\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002

    "},{"location":"chapter_searching/binary_search_edge/#1022","title":"10.2.2. \u00a0 \u4e8c\u5206\u65b9\u6cd5","text":"

    \u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u4ec5\u901a\u8fc7\u4e8c\u5206\u67e5\u627e\u89e3\u51b3\u4ee5\u4e0a\u95ee\u9898\u3002\u6574\u4f53\u7b97\u6cd5\u6d41\u7a0b\u4e0d\u53d8\uff0c\u5148\u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65ad target \u548c nums[m] \u5927\u5c0f\u5173\u7cfb\uff1a

    • \u5f53 nums[m] < target \u6216 nums[m] > target \u65f6\uff0c\u8bf4\u660e\u8fd8\u6ca1\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u91c7\u53d6\u4e0e\u4e0a\u8282\u4ee3\u7801\u76f8\u540c\u7684\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
    • \u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u201c\u5c0f\u4e8e target \u7684\u5143\u7d20\u201d\u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u91c7\u7528 \\(j = m - 1\\) \u6765\u7f29\u5c0f\u533a\u95f4\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(j\\) \u5411\u5c0f\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u4e8c\u5206\u67e5\u627e\u5b8c\u6210\u540e\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u8fb9\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(i\\) \u5373\u53ef\u3002

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

    \u6ce8\u610f\uff0c\u6570\u7ec4\u53ef\u80fd\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20 target \u3002\u56e0\u6b64\u5728\u51fd\u6570\u8fd4\u56de\u524d\uff0c\u6211\u4eec\u9700\u8981\u5148\u5224\u65ad nums[i] \u4e0e target \u662f\u5426\u76f8\u7b49\uff0c\u4ee5\u53ca\u7d22\u5f15 \\(i\\) \u662f\u5426\u8d8a\u754c\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchLeftEdge(int[] nums, int target) {\nint i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\nj = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n}\nif (i == nums.length || nums[i] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn i;\n}\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\nint i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\nj = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n}\nif (i == nums.size() || nums[i] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn i;\n}\n
    binary_search_edge.py
    def binary_search_left_edge(nums: list[int], target: int) -> int:\n\"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20\"\"\"\ni, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile i <= j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:\ni = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelif nums[m] > target:\nj = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse:\nj = m - 1  # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\nif i == len(nums) or nums[i] != target:\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn i\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\ni, j := 0, len(nums)-1\nfor i <= j {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nm := i + (j-i)/2\nif nums[m] < target {\n// target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target {\n// target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else {\n// \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n}\n}\nif i == len(nums) || nums[i] != target {\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\nreturn i\n}\n
    binary_search_edge.js
    [class]{}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.ts
    [class]{}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.c
    [class]{}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.cs
    [class]{binary_search_edge}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nvar i = 0\nvar j = nums.count - 1\nwhile i <= j {\nlet m = i + (j - 1) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target {\ni = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n} else if nums[m] > target {\nj = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n} else {\nj = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n}\n}\nif i == nums.count || nums[i] != target {\nreturn -1 // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\nreturn i\n}\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchLeftEdge}\n
    "},{"location":"chapter_searching/binary_search_edge/#1023","title":"10.2.3. \u00a0 \u67e5\u627e\u53f3\u8fb9\u754c","text":"

    \u7c7b\u4f3c\u5730\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u8fb9\u7684 target \u3002\u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c i = m + 1 \uff0c\u4f7f\u5f97\u6307\u9488 \\(i\\) \u5411\u5927\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u5b8c\u6210\u4e8c\u5206\u540e\uff0c\\(i\\) \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u6700\u53f3\u8fb9\u7684 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(j\\) \u5373\u53ef\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchRightEdge(int[] nums, int target) {\nint i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\ni = m + 1; // \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\n}\nif (j < 0 || nums[j] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn j;\n}\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchRightEdge(vector<int> &nums, int target) {\nint i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\ni = m + 1; // \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\n}\nif (j < 0 || nums[j] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn j;\n}\n
    binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n\"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20\"\"\"\ni, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile i <= j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:\ni = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelif nums[m] > target:\nj = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse:\ni = m + 1  # \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\nif j == len(nums) or nums[j] != target:\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn j\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchRightEdge(nums []int, target int) int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\ni, j := 0, len(nums)-1\nfor i <= j {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nm := i + (j-i)/2\nif nums[m] < target {\n// target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target {\n// target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else {\n// \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n}\n}\nif j < 0 || nums[j] != target {\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\nreturn j\n}\n
    binary_search_edge.js
    [class]{}-[func]{binarySearchRightEdge}\n
    binary_search_edge.ts
    [class]{}-[func]{binarySearchRightEdge}\n
    binary_search_edge.c
    [class]{}-[func]{binarySearchRightEdge}\n
    binary_search_edge.cs
    [class]{binary_search_edge}-[func]{binarySearchRightEdge}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nvar i = 0\nvar j = nums.count - 1\nwhile i <= j {\nlet m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target {\ni = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n} else if nums[m] > target {\nj = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n} else {\ni = m + 1 // \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\n}\n}\nif j < 0 || nums[j] != target {\nreturn -1 // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\nreturn j\n}\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchRightEdge}\n

    \u89c2\u5bdf\u4e0b\u56fe\uff0c\u641c\u7d22\u6700\u53f3\u8fb9\u5143\u7d20\u65f6\u6307\u9488 \\(j\\) \u7684\u4f5c\u7528\u4e0e\u641c\u7d22\u6700\u5de6\u8fb9\u5143\u7d20\u65f6\u6307\u9488 \\(i\\) \u7684\u4f5c\u7528\u4e00\u81f4\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u641c\u7d22\u6700\u5de6\u8fb9\u5143\u7d20\u548c\u6700\u53f3\u8fb9\u5143\u7d20\u7684\u5b9e\u73b0\u662f\u955c\u50cf\u5bf9\u79f0\u7684\u3002

    Fig. \u67e5\u627e\u6700\u5de6\u8fb9\u548c\u6700\u53f3\u8fb9\u5143\u7d20\u7684\u5bf9\u79f0\u6027

    Tip

    \u4ee5\u4e0a\u4ee3\u7801\u91c7\u53d6\u7684\u90fd\u662f\u201c\u53cc\u95ed\u533a\u95f4\u201d\u5199\u6cd5\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u5199\u6cd5\u3002

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

    \u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u5e38\u901a\u8fc7\u5c06\u7ebf\u6027\u67e5\u627e\u66ff\u6362\u4e3a\u54c8\u5e0c\u67e5\u627e\u6765\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u7b97\u6cd5\u9898\u6765\u52a0\u6df1\u7406\u89e3\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u5143\u7d20 target \uff0c\u8bf7\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u201c\u548c\u201d\u4e3a target \u7684\u4e24\u4e2a\u5143\u7d20\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u4e2a\u89e3\u5373\u53ef\u3002

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

    Fig. \u7ebf\u6027\u67e5\u627e\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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
    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
    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
    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
    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
    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
    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
    two_sum.cs
    /* \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
    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
    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/#1032","title":"10.3.2. \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

    \u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u952e\u503c\u5bf9\u5206\u522b\u4e3a\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u6267\u884c\uff1a

    1. \u5224\u65ad\u6570\u5b57 target - nums[i] \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\u5219\u76f4\u63a5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1b
    2. \u5c06\u952e\u503c\u5bf9 nums[i] \u548c\u7d22\u5f15 i \u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\uff1b
    <1><2><3>

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff0c\u4ec5\u9700\u5355\u5c42\u5faa\u73af\u5373\u53ef\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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
    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
    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
    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
    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
    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
    two_sum.c
    /* \u54c8\u5e0c\u8868 */\nstruct hashTable {\nint key;\nint val;\nUT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n};\ntypedef struct hashTable hashTable;\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
    two_sum.cs
    /* \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)\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++) {\nif (dic.ContainsKey(target - nums[i])) {\nreturn new int[] { dic[target - nums[i]], i };\n}\ndic.Add(nums[i], i);\n}\nreturn new int[0];\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 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
    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":"10.4. \u00a0 \u91cd\u8bc6\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

    \u6839\u636e\u5b9e\u73b0\u601d\u8def\uff0c\u641c\u7d22\u7b97\u6cd5\u603b\u4f53\u53ef\u5206\u4e3a\u4e24\u79cd\uff1a

    • \u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\uff0c\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u7b49\u3002
    • \u5229\u7528\u6570\u636e\u7ec4\u7ec7\u7ed3\u6784\u6216\u6570\u636e\u5305\u542b\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u5b9e\u73b0\u9ad8\u6548\u5143\u7d20\u67e5\u627e\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u548c\u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u7b49\u3002

    \u4e0d\u96be\u53d1\u73b0\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u70b9\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u56e0\u6b64\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ece\u66f4\u52a0\u7cfb\u7edf\u7684\u89c6\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5ba1\u89c6\u641c\u7d22\u7b97\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1041","title":"10.4.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/#1042","title":"10.4.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/#1043","title":"10.4.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":"10.5. \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.3. \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

    \u300c\u5192\u6ce1\u6392\u5e8f Bubble Sort\u300d\u901a\u8fc7\u8fde\u7eed\u5730\u6bd4\u8f83\u4e0e\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u5b9e\u73b0\u6392\u5e8f\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u6c14\u6ce1\u4ece\u5e95\u90e8\u5347\u5230\u9876\u90e8\u4e00\u6837\uff0c\u56e0\u6b64\u5f97\u540d\u5192\u6ce1\u6392\u5e8f\u3002

    \u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u4e0a\u8ff0\u8fc7\u7a0b\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

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

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

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

    1. \u9996\u5148\uff0c\u5bf9 \\(n\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\uff0c
    2. \u63a5\u4e0b\u6765\uff0c\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u201c\u5192\u6ce1\u201d\u540e\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    4. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u65e0\u9700\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002

    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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = len(nums)\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in range(n - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = 0; i < size - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.Length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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.swift
    /* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nvar i: usize = nums.len - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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/#1132","title":"11.3.2. \u00a0 \u6548\u7387\u4f18\u5316","text":"

    \u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u201c\u5192\u6ce1\u201d\u4e2d\u6ca1\u6709\u6267\u884c\u4efb\u4f55\u4ea4\u6362\u64cd\u4f5c\uff0c\u8bf4\u660e\u6570\u7ec4\u5df2\u7ecf\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d flag \u6765\u76d1\u6d4b\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e00\u65e6\u51fa\u73b0\u5c31\u7acb\u5373\u8fd4\u56de\u3002

    \u7ecf\u8fc7\u4f18\u5316\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u5dee\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.length - 1; i > 0; i--) {\nboolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.size() - 1; i > 0; i--) {\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = len(nums)\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in range(n - 1, 0, -1):\nflag = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n# \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := len(nums) - 1; i > 0; i-- {\nflag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = 0; i < size - 1; i++) {\nbool flag = false;\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.Length - 1; i > 0; i--) {\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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) 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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\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\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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/bubble_sort/#1133","title":"11.3.3. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3001\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5404\u8f6e\u201c\u5192\u6ce1\u201d\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\) , \\(n - 2\\) , \\(\\cdots\\) , \\(2\\) , \\(1\\) \uff0c\u603b\u548c\u4e3a \\(\\frac{(n - 1) n}{2}\\) \u3002\u5728\u5f15\u5165 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\u3002
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8. \u00a0 \u6876\u6392\u5e8f","text":"

    \u524d\u8ff0\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/#1181","title":"11.8.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 * float64(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// \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++) {\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// \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// \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) {\nforeach (float num in bucket) {\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/#1182","title":"11.8.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
    • \u81ea\u9002\u5e94\u6392\u5e8f\uff1a\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\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n + k)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u6876\u6392\u5e8f\u662f\u5426\u7a33\u5b9a\u53d6\u51b3\u4e8e\u6392\u5e8f\u6876\u5185\u5143\u7d20\u7684\u7b97\u6cd5\u662f\u5426\u7a33\u5b9a\u3002
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3. \u00a0 \u5982\u4f55\u5b9e\u73b0\u5e73\u5747\u5206\u914d","text":"

    \u6876\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7406\u8bba\u4e0a\u53ef\u4ee5\u8fbe\u5230 \\(O(n)\\) \uff0c\u5173\u952e\u5728\u4e8e\u5c06\u5143\u7d20\u5747\u5300\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u56e0\u4e3a\u5b9e\u9645\u6570\u636e\u5f80\u5f80\u4e0d\u662f\u5747\u5300\u5206\u5e03\u7684\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u8981\u5c06\u6dd8\u5b9d\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u4ef7\u683c\u8303\u56f4\u5e73\u5747\u5206\u914d\u5230 10 \u4e2a\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u4ef7\u683c\u5206\u5e03\u4e0d\u5747\uff0c\u4f4e\u4e8e 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u4e8e 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c06\u4ef7\u683c\u533a\u95f4\u5e73\u5747\u5212\u5206\u4e3a 10 \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.9. \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/#1191","title":"11.9.1. \u00a0 \u7b80\u5355\u5b9e\u73b0","text":"

    \u5148\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u3002\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8d1f\u6574\u6570\u201d\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) * m);\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// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in 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];\nforeach (int num in 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.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/#1192","title":"11.9.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) * m);\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// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in 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];\nforeach (int num in 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.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/#1193","title":"11.9.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)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u987a\u5e8f\u662f\u201c\u4ece\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u904d\u5386 nums \u53ef\u4ee5\u907f\u514d\u6539\u53d8\u76f8\u7b49\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b9e\u73b0\u7a33\u5b9a\u6392\u5e8f\u3002\u5b9e\u9645\u4e0a\uff0c\u6b63\u5e8f\u904d\u5386 nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\uff0c\u4f46\u7ed3\u679c\u662f\u975e\u7a33\u5b9a\u7684\u3002
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4. \u00a0 \u5c40\u9650\u6027","text":"

    \u770b\u5230\u8fd9\u91cc\uff0c\u4f60\u4e5f\u8bb8\u4f1a\u89c9\u5f97\u8ba1\u6570\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u4ec5\u901a\u8fc7\u7edf\u8ba1\u6570\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9ad8\u6548\u7684\u6392\u5e8f\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/heap_sort/","title":"11.7. \u00a0 \u5806\u6392\u5e8f","text":"

    Tip

    \u9605\u8bfb\u672c\u8282\u524d\uff0c\u8bf7\u786e\u4fdd\u5df2\u5b66\u5b8c\u300c\u5806\u300d\u7ae0\u8282\u3002

    \u300c\u5806\u6392\u5e8f Heap Sort\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u5806\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\u7684\u9ad8\u6548\u6392\u5e8f\u7b97\u6cd5\u3002\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5df2\u7ecf\u5b66\u8fc7\u7684\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\u5806\u6392\u5e8f\uff1a

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5c0f\u9876\u5806\uff0c\u6b64\u65f6\u6700\u5c0f\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u4e0d\u65ad\u6267\u884c\u51fa\u5806\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8bb0\u5f55\u51fa\u5806\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

    \u4ee5\u4e0a\u65b9\u6cd5\u867d\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u989d\u5916\u6570\u7ec4\u6765\u4fdd\u5b58\u5f39\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f83\u6d6a\u8d39\u7a7a\u95f4\u3002\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4e00\u79cd\u66f4\u52a0\u4f18\u96c5\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5806\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5927\u9876\u5806\u3002\u5b8c\u6210\u540e\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u5c06\u5806\u9876\u5143\u7d20\uff08\u7b2c\u4e00\u4e2a\u5143\u7d20\uff09\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff09\u4ea4\u6362\u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u5806\u7684\u957f\u5ea6\u51cf \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u52a0 \\(1\\) \u3002
    3. \u4ece\u5806\u9876\u5143\u7d20\u5f00\u59cb\uff0c\u4ece\u9876\u5230\u5e95\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff08Sift Down\uff09\u3002\u5b8c\u6210\u5806\u5316\u540e\uff0c\u5806\u7684\u6027\u8d28\u5f97\u5230\u4fee\u590d\u3002
    4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u548c 3. \u6b65\u3002\u5faa\u73af \\(n - 1\\) \u8f6e\u540e\uff0c\u5373\u53ef\u5b8c\u6210\u6570\u7ec4\u6392\u5e8f\u3002

    \u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u548c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u4e2a\u5f39\u51fa\u5143\u7d20\u7684\u6b65\u9aa4\u3002

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

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e0e\u5806\u7ae0\u8282\u76f8\u540c\u7684\u4ece\u9876\u81f3\u5e95\u5806\u5316\uff08Sift Down\uff09\u7684\u51fd\u6570\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u5806\u7684\u957f\u5ea6\u4f1a\u968f\u7740\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u51cf\u5c0f\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u7ed9 Sift Down \u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u957f\u5ea6\u53c2\u6570 \\(n\\) \uff0c\u7528\u4e8e\u6307\u5b9a\u5806\u7684\u5f53\u524d\u6709\u6548\u957f\u5ea6\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig heap_sort.java
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = 2 * i + 1;\nint r = 2 * i + 2;\nint ma = i;\nif (l < n && nums[l] > nums[ma])\nma = l;\nif (r < n && nums[r] > nums[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\nint temp = nums[i];\nnums[i] = nums[ma];\nnums[ma] = temp;\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = nums.length / 2 - 1; i >= 0; i--) {\nsiftDown(nums, nums.length, i);\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nint tmp = nums[0];\nnums[0] = nums[i];\nnums[i] = tmp;\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums, i, 0);\n}\n}\n
    heap_sort.cpp
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = 2 * i + 1;\nint r = 2 * i + 2;\nint ma = i;\nif (l < n && nums[l] > nums[ma])\nma = l;\nif (r < n && nums[r] > nums[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}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(nums[i], nums[ma]);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n/* \u5806\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = nums.size() / 2 - 1; i >= 0; --i) {\nsiftDown(nums, nums.size(), i);\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor (int i = nums.size() - 1; i > 0; --i) {\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(nums[0], nums[i]);\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums, i, 0);\n}\n}\n
    heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n\"\"\"\u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\nwhile True:\n# \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nl = 2 * i + 1\nr = 2 * i + 2\nma = i\nif l < n and nums[l] > nums[ma]:\nma = l\nif r < n and nums[r] > nums[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\nnums[i], nums[ma] = nums[ma], nums[i]\n# \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\ndef heap_sort(nums: list[int]):\n\"\"\"\u5806\u6392\u5e8f\"\"\"\n# \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in range(len(nums) // 2 - 1, -1, -1):\nsift_down(nums, len(nums), i)\n# \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor i in range(len(nums) - 1, 0, -1):\n# \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nnums[0], nums[i] = nums[i], nums[0]\n# \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsift_down(nums, i, 0)\n
    heap_sort.go
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\nfor true {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nl := 2*i + 1\nr := 2*i + 2\nma := i\nif l < n && (*nums)[l] > (*nums)[ma] {\nma = l\n}\nif r < n && (*nums)[r] > (*nums)[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\n(*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n}\n}\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i := len(*nums)/2 - 1; i >= 0; i-- {\nsiftDown(nums, len(*nums), i)\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor i := len(*nums) - 1; i > 0; i-- {\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n(*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums, i, 0)\n}\n}\n
    heap_sort.js
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    heap_sort.ts
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    heap_sort.c
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    heap_sort.cs
    [class]{heap_sort}-[func]{siftDown}\n[class]{heap_sort}-[func]{heapSort}\n
    heap_sort.swift
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\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 = 2 * i + 1\nlet r = 2 * i + 2\nvar ma = i\nif l < n, nums[l] > nums[ma] {\nma = l\n}\nif r < n, nums[r] > nums[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\nnums.swapAt(i, ma)\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n}\n}\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\nsiftDown(nums: &nums, n: nums.count, i: i)\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nnums.swapAt(0, i)\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums: &nums, n: i, i: 0)\n}\n}\n
    heap_sort.zig
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5efa\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff0c\u5171\u5faa\u73af \\(n - 1\\) \u8f6e\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f \uff1a\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u4f7f\u7528 \\(O(1)\\) \u7a7a\u95f4\u3002\u5143\u7d20\u4ea4\u6362\u548c\u5806\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5806\u9876\u5143\u7d20\u548c\u5806\u5e95\u5143\u7d20\u65f6\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002
    "},{"location":"chapter_sorting/insertion_sort/","title":"11.4. \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

    \u300c\u63d2\u5165\u6392\u5e8f Insertion Sort\u300d\u662f\u4e00\u79cd\u7b80\u5355\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u624b\u52a8\u6574\u7406\u4e00\u526f\u724c\u7684\u8fc7\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

    \u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u4e00\u4e2a\u57fa\u51c6\u5143\u7d20\uff0c\u5c06\u8be5\u5143\u7d20\u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u8be5\u5143\u7d20\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

    \u56de\u5fc6\u6570\u7ec4\u7684\u5143\u7d20\u63d2\u5165\u64cd\u4f5c\uff0c\u8bbe\u57fa\u51c6\u5143\u7d20\u4e3a base \uff0c\u6211\u4eec\u9700\u8981\u5c06\u4ece\u76ee\u6807\u7d22\u5f15\u5230 base \u4e4b\u95f4\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u518d\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

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

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

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

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6570\u7ec4\u7684\u7b2c 1 \u4e2a\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
    2. \u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

    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\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base;        // \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\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // \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\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\nfor i in range(1, len(nums)):\nbase = nums[i]\nj = i - 1\n# \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0 and nums[j] > base:\nnums[j + 1] = nums[j]  # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\nnums[j + 1] = base  # \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := 1; i < len(nums); i++ {\nbase := nums[i]\nj := i - 1\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nfor j >= 0 && nums[j] > base {\nnums[j+1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--\n}\nnums[j+1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.js
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.ts
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.c
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\nfor (int i = 1; i < size; i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\n// \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nnums[j + 1] = nums[j];\nj--;\n}\n// \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// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\nfor (int i = 1; i < nums.Length; i++) {\nint bas = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > bas) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = bas;         // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.swift
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0, nums[j] > base {\nnums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\n}\nnums[j + 1] = base // \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\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 1 and nums[j - 1] > base) : (j -= 1) {\nnums[j] = nums[j - 1];  // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n}\nnums[j] = base;             // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n^2)\\) \u3001\u81ea\u9002\u5e94\u6392\u5e8f \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\u5728\u9047\u5230\u6709\u5e8f\u6570\u636e\u65f6\uff0c\u63d2\u5165\u64cd\u4f5c\u4f1a\u63d0\u524d\u7ec8\u6b62\u3002\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u63d2\u5165\u6392\u5e8f\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f \uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u5c06\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\uff0c\u4e0d\u4f1a\u6539\u53d8\u5b83\u4eec\u7684\u987a\u5e8f\u3002
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3. \u00a0 \u63d2\u5165\u6392\u5e8f\u4f18\u52bf","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u800c\u6211\u4eec\u5373\u5c06\u5b66\u4e60\u7684\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u6bd4\u5feb\u901f\u6392\u5e8f\u66f4\u9ad8\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

    \u8fd9\u4e2a\u7ed3\u8bba\u4e0e\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u7684\u9002\u7528\u60c5\u51b5\u7684\u7ed3\u8bba\u7c7b\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u8fd9\u7c7b \\(O(n \\log n)\\) \u7684\u7b97\u6cd5\u5c5e\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6570\u503c\u6bd4\u8f83\u63a5\u8fd1\uff0c\u590d\u6742\u5ea6\u4e0d\u5360\u4e3b\u5bfc\u4f5c\u7528\uff1b\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u8d77\u5230\u51b3\u5b9a\u6027\u56e0\u7d20\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\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\u5feb\u901f\u6392\u5e8f\uff1b\u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

    \u867d\u7136\u5192\u6ce1\u6392\u5e8f\u3001\u9009\u62e9\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u9891\u7387\u663e\u8457\u9ad8\u4e8e\u5192\u6ce1\u6392\u5e8f\u548c\u9009\u62e9\u6392\u5e8f\u3002\u8fd9\u662f\u56e0\u4e3a\uff1a

    • \u5192\u6ce1\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u4ea4\u6362\u5b9e\u73b0\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5171\u6d89\u53ca 3 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002\u5982\u679c\u7ed9\u5b9a\u4e00\u7ec4\u90e8\u5206\u6709\u5e8f\u7684\u6570\u636e\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9009\u62e9\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u4e0d\u7a33\u5b9a\uff0c\u65e0\u6cd5\u5e94\u7528\u4e8e\u591a\u7ea7\u6392\u5e8f\u3002
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6. \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

    \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/#1161","title":"11.6.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(nums[left : right + 1])\n# \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nleft_start = 0\nleft_end = mid - left\n# \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nright_start = mid + 1 - left\nright_end = right - left\n# i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\ni = left_start\nj = 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 = (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// \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// \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) 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/#1162","title":"11.6.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5212\u5206\u4ea7\u751f\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u5c42\u5408\u5e76\u7684\u603b\u64cd\u4f5c\u6570\u91cf\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002\u5408\u5e76\u64cd\u4f5c\u9700\u8981\u501f\u52a9\u8f85\u52a9\u6570\u7ec4\u5b9e\u73b0\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\u3002
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3. \u00a0 \u94fe\u8868\u6392\u5e8f *","text":"

    \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.5. \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
    /* \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/* \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) {\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.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/#1151","title":"11.5.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\u672a\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 = 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// \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/#1152","title":"11.5.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \u3001\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5728\u5e73\u5747\u60c5\u51b5\u4e0b\uff0c\u54e8\u5175\u5212\u5206\u7684\u9012\u5f52\u5c42\u6570\u4e3a \\(\\log n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u603b\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n \\log n)\\) \u65f6\u95f4\u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u5212\u5206\u4e3a\u957f\u5ea6\u4e3a \\(0\\) \u548c \\(n - 1\\) \u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u6b64\u65f6\u9012\u5f52\u5c42\u6570\u8fbe\u5230 \\(n\\) \u5c42\uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3001\u539f\u5730\u6392\u5e8f \uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\uff0c\u672a\u501f\u52a9\u989d\u5916\u6570\u7ec4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5212\u5206\u7684\u6700\u540e\u4e00\u6b65\uff0c\u57fa\u51c6\u6570\u53ef\u80fd\u4f1a\u88ab\u4ea4\u6362\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\u3002
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3. \u00a0 \u5feb\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/#1154","title":"11.5.4. \u00a0 \u57fa\u51c6\u6570\u4f18\u5316","text":"

    \u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\u7684\u65f6\u95f4\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u4f8b\u5b50\uff0c\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u4e8e\u6211\u4eec\u9009\u62e9\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u5728\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u57fa\u51c6\u6570\u88ab\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u53f3\u7aef\uff0c\u5bfc\u81f4\u5de6\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n - 1\\) \u3001\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \u3002\u5982\u6b64\u9012\u5f52\u4e0b\u53bb\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\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 = 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// \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.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/#1155","title":"11.5.5. \u00a0 \u5c3e\u9012\u5f52\u4f18\u5316","text":"

    \u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u5360\u7528\u7a7a\u95f4\u8f83\u591a\u3002\u4ee5\u5b8c\u5168\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\u672a\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\u672a\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\u672a\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\u672a\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 = 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\u672a\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\u672a\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums, left, right) {\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\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\u672a\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\u672a\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\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\u672a\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\u672a\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    "},{"location":"chapter_sorting/radix_sort/","title":"11.10. \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/#11101","title":"11.10.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u4ee5\u5b66\u53f7\u6570\u636e\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6570\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6570\u6392\u5e8f\u7684\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 \\bmod d \\]

    \u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\space 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// \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}\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 = int.MinValue;\nforeach (int num in nums) {\nif (num > m) m = num;\n}\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}\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/#11102","title":"11.10.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

    \u76f8\u8f83\u4e8e\u8ba1\u6570\u6392\u5e8f\uff0c\u57fa\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u503c\u8303\u56f4\u8f83\u5927\u7684\u60c5\u51b5\uff0c\u4f46\u524d\u63d0\u662f\u6570\u636e\u5fc5\u987b\u53ef\u4ee5\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6570\u4e0d\u80fd\u8fc7\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u70b9\u6570\u4e0d\u9002\u5408\u4f7f\u7528\u57fa\u6570\u6392\u5e8f\uff0c\u56e0\u4e3a\u5176\u4f4d\u6570 \\(k\\) \u8fc7\u5927\uff0c\u53ef\u80fd\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(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)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6570\u6392\u5e8f\u9700\u8981\u501f\u52a9\u957f\u5ea6\u4e3a \\(n\\) \u548c \\(d\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\u3002
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2. \u00a0 \u9009\u62e9\u6392\u5e8f","text":"

    \u300c\u9009\u62e9\u6392\u5e8f Selection Sort\u300d\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u76f4\u63a5\uff1a\u5f00\u542f\u4e00\u4e2a\u5faa\u73af\uff0c\u6bcf\u8f6e\u4ece\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c06\u5176\u653e\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u672b\u5c3e\u3002

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u9009\u62e9\u6392\u5e8f\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u4e0b\uff1a

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u533a\u95f4\u4e3a \\([0, n-1]\\) \u3002
    2. \u9009\u53d6\u533a\u95f4 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(0\\) \u5904\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 1 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u533a\u95f4 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(1\\) \u5904\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\u3002\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u9009\u62e9\u4e0e\u4ea4\u6362\u540e\uff0c\u6570\u7ec4\u524d \\(n - 1\\) \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    5. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u65e0\u9700\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u7528 \\(k\\) \u6765\u8bb0\u5f55\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig selection_sort.java
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\nint n = nums.length;\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor (int i = 0; i < n - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nint k = i;\nfor (int j = i + 1; j < n; j++) {\nif (nums[j] < nums[k])\nk = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nint temp = nums[i];\nnums[i] = nums[k];\nnums[k] = temp;\n}\n}\n
    selection_sort.cpp
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\nint n = nums.size();\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor (int i = 0; i < n - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nint k = i;\nfor (int j = i + 1; j < n; j++) {\nif (nums[j] < nums[k])\nk = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nswap(nums[i], nums[k]);\n}\n}\n
    selection_sort.py
    def selection_sort(nums: list[int]):\n\"\"\"\u9009\u62e9\u6392\u5e8f\"\"\"\nn = len(nums)\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor i in range(n - 1):\n# \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nk = i\nfor j in range(i + 1, n):\nif nums[j] < nums[k]:\nk = j  # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n# \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nnums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.go
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums []int) {\nn := len(nums)\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor i := 0; i < n-1; i++ {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nk := i\nfor j := i + 1; j < n; j++ {\nif nums[j] < nums[k] {\n// \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\nk = j\n}\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nnums[i], nums[k] = nums[k], nums[i]\n}\n}\n
    selection_sort.js
    [class]{}-[func]{selectionSort}\n
    selection_sort.ts
    [class]{}-[func]{selectionSort}\n
    selection_sort.c
    [class]{}-[func]{selectionSort}\n
    selection_sort.cs
    [class]{selection_sort}-[func]{selectionSort}\n
    selection_sort.swift
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor i in nums.indices.dropLast() {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nvar k = i\nfor j in nums.indices.dropFirst(i + 1) {\nif nums[j] < nums[k] {\nk = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n}\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nnums.swapAt(i, k)\n}\n}\n
    selection_sort.zig
    [class]{}-[func]{selectionSort}\n
    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5916\u5faa\u73af\u5171 \\(n - 1\\) \u8f6e\uff0c\u7b2c\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6700\u540e\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(2\\) \uff0c\u5373\u5404\u8f6e\u5916\u5faa\u73af\u5206\u522b\u5305\u542b \\(n\\) , \\(n - 1\\) , \\(\\cdots\\) , \\(2\\) \u8f6e\u5185\u5faa\u73af\uff0c\u6c42\u548c\u4e3a \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5143\u7d20\u65f6\uff0c\u6709\u53ef\u80fd\u5c06 nums[i] \u4ea4\u6362\u81f3\u5176\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u8fb9\uff0c\u5bfc\u81f4\u4e24\u8005\u7684\u76f8\u5bf9\u987a\u5e8f\u53d1\u751f\u6539\u53d8\u3002

    Fig. \u9009\u62e9\u6392\u5e8f\u975e\u7a33\u5b9a\u793a\u4f8b

    "},{"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.11. \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\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u867d\u7136\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u7531\u4e8e\u5355\u5143\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\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\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_sorting/summary/#11111-q-a","title":"11.11.1. \u00a0 Q & A","text":"

    \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_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 = self.front\nres = [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};\ntypedef struct doublyListNode doublyListNode;\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};\ntypedef struct linkedListDeque linkedListDeque;\n/* \u6784\u9020\u51fd\u6570 */\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
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\npublic int val;       // \u8282\u70b9\u503c\npublic ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\npublic ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\npublic ListNode(int val) {\nthis.val = val;\nprev = null;\nnext = 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, \u5c3e\u8282\u70b9 rear\nprivate int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npublic LinkedListDeque() {\nfront = null;\nrear = 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 bool isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f\u64cd\u4f5c */\nprivate void push(int num, bool isFront) {\nListNode node = new ListNode(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++; // \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 int? pop(bool isFront) {\n// \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\nif (isEmpty()) {\nreturn null;\n}\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}\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse {\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 int? popFirst() {\nreturn pop(true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\npublic int? popLast() {\nreturn pop(false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int? peekFirst() {\nreturn isEmpty() ? null : front.val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int? 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.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 IndexOutOfBoundsException();\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int peekLast() {\nif (isEmpty())\nthrow new IndexOutOfBoundsException();\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\"\"\"\nif self.is_empty():\nraise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\nreturn self.__nums[self.__front]\ndef peek_last(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\nif self.is_empty():\nraise IndexError(\"\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};\ntypedef struct arrayDeque arrayDeque;\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
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate readonly 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 bool 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()) {\nConsole.WriteLine(\"\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()) {\nConsole.WriteLine(\"\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 InvalidOperationException();\n}\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int peekLast() {\nif (isEmpty()) {\nthrow new InvalidOperationException();\n}\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.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 IndexOutOfBoundsException();\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};\ntypedef struct linkedListQueue linkedListQueue;\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 {\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 bool 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 if (rear != null) {\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 || front == null)\nthrow new Exception();\nreturn front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\nif (front == null)\nreturn Array.Empty<int>();\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.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 IndexOutOfBoundsException();\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\"\"\"\nif self.__size == self.capacity():\nraise IndexError(\"\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\u90e8F\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\"\"\"\nif self.is_empty():\nraise IndexError(\"\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 = [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};\ntypedef struct arrayQueue arrayQueue;\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 {\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 bool isEmpty() {\nreturn queSize == 0;\n}\n/* \u5165\u961f */\npublic void push(int num) {\nif (queSize == capacity()) {\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() {\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 Exception();\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 % 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 IndexOutOfBoundsException();\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 = []\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};\ntypedef struct linkedListStack linkedListStack;\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 {\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 bool 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() {\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() {\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() {\nif (stackPeek == null)\nreturn Array.Empty<int>();\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.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 IndexOutOfBoundsException();\nreturn stack.remove(size() - 1);\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new IndexOutOfBoundsException();\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\"\"\"\nif self.is_empty():\nraise IndexError(\"\u6808\u4e3a\u7a7a\")\nreturn self.__stack.pop()\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\nif self.is_empty():\nraise IndexError(\"\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};\ntypedef struct arrayStack arrayStack;\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 {\nprivate List<int> stack;\npublic ArrayStack() {\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() {\nreturn stack.Count();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic bool 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 Exception();\nvar val = peek();\nstack.RemoveAt(size() - 1);\nreturn val;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new Exception();\nreturn stack[size() - 1];\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\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":"7.3. \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a","text":"

    \u5728\u94fe\u8868\u8868\u793a\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u5b58\u50a8\u5355\u5143\u4e3a\u8282\u70b9 TreeNode \uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u76f8\u8fde\u63a5\u3002\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/#731","title":"7.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/#732","title":"7.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/#733","title":"7.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":"7.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/#751-avl","title":"7.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// \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.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// \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/#752-avl","title":"7.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) {\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) {\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// \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\nint balanceFactorInt = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactorInt > 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 (balanceFactorInt < -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.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/#753-avl","title":"7.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) {\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) 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) {\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) 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 {\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.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\nvar 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/#754-avl","title":"7.5.4. \u00a0 AVL \u6811\u5178\u578b\u5e94\u7528","text":"
    • \u7ec4\u7ec7\u548c\u5b58\u50a8\u5927\u578b\u6570\u636e\uff0c\u9002\u7528\u4e8e\u9ad8\u9891\u67e5\u627e\u3001\u4f4e\u9891\u589e\u5220\u7684\u573a\u666f\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":"7.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/#741","title":"7.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) {\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) cur =\ncur.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.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\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\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\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\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\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\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// \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\nTreeNode node = new TreeNode(num);\nif (pre != null) {\nif (pre.val < num)\npre.right = node;\nelse\npre.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\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\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 (cur != root) {\nif (pre.left == cur)\npre.left = child;\nelse\npre.right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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\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 (cur != root) {\nif (pre->left == cur)\npre->left = child;\nelse\npre->right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = child;\n}\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 cur != self.root:\nif pre.left == cur:\npre.left = child\nelse:\npre.right = child\nelse:\n# \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nself.__root = cur\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// \u5220\u9664\u8282\u70b9 cur\nif cur != bst.root {\nif pre.Left == cur {\npre.Left = child\n} else {\npre.Right = child\n}\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nbst.root = child\n}\n// \u5b50\u8282\u70b9\u6570\u4e3a 2\n} else {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\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 (cur != root) {\nif (pre.left === cur) pre.left = child;\nelse pre.right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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.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 (cur != root) {\nif (pre!.left === cur) {\npre!.left = child;\n} else {\npre!.right = child;\n}\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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// \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 || pre == 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 (cur != root) {\nif (pre.left == cur)\npre.left = child;\nelse\npre.right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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\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.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 cur != root {\nif pre?.left === cur {\npre?.left = child\n} else {\npre?.right = child\n}\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = cur;\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\nvar 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/#742","title":"7.4.2. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387","text":"

    \u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528\u6570\u7ec4\u6216\u4e8c\u53c9\u641c\u7d22\u6811\u5b58\u50a8\u3002

    \u89c2\u5bdf\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/#743","title":"7.4.3. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u5e38\u89c1\u5e94\u7528","text":"
    • \u7528\u4f5c\u7cfb\u7edf\u4e2d\u7684\u591a\u7ea7\u7d22\u5f15\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u67e5\u627e\u3001\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u3002
    • \u4f5c\u4e3a\u67d0\u4e9b\u641c\u7d22\u7b97\u6cd5\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002
    • \u7528\u4e8e\u5b58\u50a8\u6570\u636e\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72b6\u6001\u3002
    "},{"location":"chapter_tree/binary_tree/","title":"7.1. \u00a0 \u4e8c\u53c9\u6811","text":"

    \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/#711","title":"7.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/#712","title":"7.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/#713","title":"7.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/#714","title":"7.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":"7.2. \u00a0 \u4e8c\u53c9\u6811\u904d\u5386","text":"

    \u4ece\u7269\u7406\u7ed3\u6784\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6811\u662f\u4e00\u79cd\u57fa\u4e8e\u94fe\u8868\u7684\u6570\u636e\u7ed3\u6784\uff0c\u56e0\u6b64\u5176\u904d\u5386\u65b9\u5f0f\u662f\u901a\u8fc7\u6307\u9488\u9010\u4e2a\u8bbf\u95ee\u8282\u70b9\u3002\u7136\u800c\uff0c\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u8fd9\u4f7f\u5f97\u904d\u5386\u6811\u6bd4\u904d\u5386\u94fe\u8868\u66f4\u52a0\u590d\u6742\uff0c\u9700\u8981\u501f\u52a9\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u3002

    \u4e8c\u53c9\u6811\u5e38\u89c1\u7684\u904d\u5386\u65b9\u5f0f\u5305\u62ec\u5c42\u5e8f\u904d\u5386\u3001\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u7b49\u3002

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1. \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

    \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 = []\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));\n// \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\nfree(queue);\nreturn arr;\n}\n
    binary_tree_bfs.cs
    /* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode root) {\n// \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\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) {\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/#722","title":"7.2.2. \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386","text":"

    \u76f8\u5e94\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\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) {\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) {\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) {\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":"7.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\u6392\u5217\uff09\uff1a

    \u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 Gonglja, justin\u2010tse, krahets, nuomi1, Reanon, sjinzh \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\uff09\u3002\u611f\u8c22\u4ed6\u4eec\u4ed8\u51fa\u7684\u65f6\u95f4\u4e0e\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u4eec\u786e\u4fdd\u4e86\u5404\u8bed\u8a00\u4ee3\u7801\u7684\u89c4\u8303\u4e0e\u7edf\u4e00\u3002

    GongljaC / C++ justin-tseJS / TS krahetsJava / Python nuomi1Swift ReanonGo / C sjinzhRust / Zig"},{"location":"chapter_appendix/contribution/","title":"13.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/#1321","title":"13.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/#1322","title":"13.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/#1323-docker","title":"13.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":"13.1. \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1311-vscode","title":"13.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/#1312-java","title":"13.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/#1313-cc","title":"13.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/#1314-python","title":"13.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/#1315-go","title":"13.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/#1316-javascript","title":"13.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/#1317-c","title":"13.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/#1318-swift","title":"13.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/#1319-rust","title":"13.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) {\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// \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.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// \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.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// \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.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# \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\nfor i, num in enumerate(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) {\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\nforeach (int num in nums) {\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) {\nfor (int i = 0; i < nums.Length; i++) {\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) {\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) {\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) {\nfor (int i = 0; i < index; i++) {\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) {\nint index = 0;\nwhile (head != null) {\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, prev) {\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 = 0\nfor i in range(len(list)):\ncount += 1\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 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: 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\nif index < 0 or index >= self.__size:\nraise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\nreturn self.__nums[index]\ndef set(self, num: int, index: int) -> None:\n\"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\nif index < 0 or index >= self.__size:\nraise IndexError(\"\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\"\"\"\nif index < 0 or index >= self.__size:\nraise IndexError(\"\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\"\"\"\nif index < 0 or index >= self.__size:\nraise IndexError(\"\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};\ntypedef struct myList myList;\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 {\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() {\nnums = new int[numsCapacity];\n}\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5373\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\npublic int size() {\nreturn numsSize;\n}\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\npublic int capacity() {\nreturn numsCapacity;\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 >= numsSize)\nthrow new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\nreturn nums[index];\n}\n/* \u66f4\u65b0\u5143\u7d20 */\npublic void set(int index, int num) {\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// \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) {\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--) {\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) {\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++) {\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// \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// \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++) {\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_array_and_linkedlist/summary/#441-q-a","title":"4.4.1. \u00a0 Q & A","text":"

    \u6570\u7ec4\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5b58\u50a8\u5728\u5806\u4e0a\uff0c\u5bf9\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u5426\u6709\u5f71\u54cd\uff1f

    \u6808\u5185\u5b58\u5206\u914d\u7531\u7f16\u8bd1\u5668\u81ea\u52a8\u5b8c\u6210\uff0c\u800c\u5806\u5185\u5b58\u7531\u7a0b\u5e8f\u5458\u5728\u4ee3\u7801\u4e2d\u5206\u914d\uff08\u6ce8\u610f\uff0c\u8fd9\u91cc\u7684\u6808\u548c\u5806\u548c\u6570\u636e\u7ed3\u6784\u4e2d\u7684\u6808\u548c\u5806\u4e0d\u662f\u540c\u4e00\u6982\u5ff5\uff09\u3002

    1. \u6808\u4e0d\u7075\u6d3b\uff0c\u5206\u914d\u7684\u5185\u5b58\u5927\u5c0f\u4e0d\u53ef\u66f4\u6539\uff1b\u5806\u76f8\u5bf9\u7075\u6d3b\uff0c\u53ef\u4ee5\u52a8\u6001\u5206\u914d\u5185\u5b58\uff1b
    2. \u6808\u662f\u4e00\u5757\u6bd4\u8f83\u5c0f\u7684\u5185\u5b58\uff0c\u5bb9\u6613\u51fa\u73b0\u5185\u5b58\u4e0d\u8db3\uff1b\u5806\u5185\u5b58\u5f88\u5927\uff0c\u4f46\u662f\u7531\u4e8e\u662f\u52a8\u6001\u5206\u914d\uff0c\u5bb9\u6613\u788e\u7247\u5316\uff0c\u7ba1\u7406\u5806\u5185\u5b58\u7684\u96be\u5ea6\u66f4\u5927\u3001\u6210\u672c\u66f4\u9ad8\uff1b
    3. \u8bbf\u95ee\u6808\u6bd4\u8bbf\u95ee\u5806\u66f4\u5feb\uff0c\u56e0\u4e3a\u6808\u5185\u5b58\u8f83\u5c0f\u3001\u5bf9\u7f13\u5b58\u53cb\u597d\uff0c\u5806\u5e27\u5206\u6563\u5728\u5f88\u5927\u7684\u7a7a\u95f4\u5185\uff0c\u4f1a\u51fa\u73b0\u66f4\u591a\u7684\u7f13\u5b58\u672a\u547d\u4e2d\uff1b

    \u4e3a\u4ec0\u4e48\u6570\u7ec4\u4f1a\u5f3a\u8c03\u8981\u6c42\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u5374\u6ca1\u6709\u5f3a\u8c03\u540c\u7c7b\u578b\u5462\uff1f

    \u94fe\u8868\u7531\u7ed3\u70b9\u7ec4\u6210\uff0c\u7ed3\u70b9\u4e4b\u95f4\u7531\u6307\u9488\u8fde\u63a5\uff0c\u5404\u4e2a\u7ed3\u70b9\u53ef\u4ee5\u5b58\u50a8\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f8b\u5982 int, double, string, object \u7b49\u3002

    \u76f8\u5bf9\u5730\uff0c\u6570\u7ec4\u5143\u7d20\u5219\u5fc5\u987b\u662f\u76f8\u540c\u7c7b\u578b\u7684\uff0c\u8fd9\u6837\u624d\u80fd\u901a\u8fc7\u8ba1\u7b97\u504f\u79fb\u91cf\u6765\u83b7\u53d6\u5bf9\u5e94\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u5982\u679c\u6570\u7ec4\u540c\u65f6\u5305\u542b int \u548c long \u4e24\u79cd\u7c7b\u578b\uff0c\u5355\u4e2a\u5143\u7d20\u5206\u522b\u5360\u7528 4 bytes \u548c 8 bytes \uff0c\u90a3\u4e48\u6b64\u65f6\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5305\u542b\u4e86\u4e24\u79cd elementLength \u3002

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

    \u5220\u9664\u8282\u70b9\u540e\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8bbe\u4e3a \\(\\text{None}\\) \u5462\uff1f

    \u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u4ece\u8be5\u94fe\u8868\u7684\u89d2\u5ea6\u770b\uff0c\u4ece\u5934\u7ed3\u70b9\u904d\u5386\u5230\u5c3e\u7ed3\u70b9\u5df2\u7ecf\u9047\u4e0d\u5230 P \u4e86\u3002\u8fd9\u610f\u5473\u7740\u7ed3\u70b9 P \u5df2\u7ecf\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u4e86\uff0c\u6b64\u65f6\u7ed3\u70b9 P \u6307\u5411\u54ea\u91cc\u90fd\u4e0d\u4f1a\u5bf9\u8fd9\u6761\u94fe\u8868\u4ea7\u751f\u5f71\u54cd\u4e86\u3002

    \u4ece\u5783\u573e\u56de\u6536\u7684\u89d2\u5ea6\u770b\uff0c\u5bf9\u4e8e Java, Python, Go \u7b49\u62e5\u6709\u81ea\u52a8\u5783\u573e\u56de\u6536\u7684\u8bed\u8a00\u6765\u8bf4\uff0c\u8282\u70b9 P \u662f\u5426\u88ab\u56de\u6536\u53d6\u51b3\u4e8e\u662f\u5426\u6709\u4ecd\u5b58\u5728\u6307\u5411\u5b83\u7684\u5f15\u7528\uff0c\u800c\u4e0d\u662f P.next \u7684\u503c\u3002\u5728 C, C++ \u7b49\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u624b\u52a8\u91ca\u653e\u8282\u70b9\u5185\u5b58\u3002

    \u5728\u94fe\u8868\u4e2d\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u5220\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u67e5\u627e\u5143\u7d20\uff0c\u90a3\u4e3a\u4ec0\u4e48\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

    \u5982\u679c\u662f\u5148\u67e5\u627e\u5143\u7d20\u3001\u518d\u5220\u9664\u5143\u7d20\uff0c\u786e\u5b9e\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u94fe\u8868\u7684 \\(O(1)\\) \u589e\u5220\u7684\u4f18\u52bf\u53ef\u4ee5\u5728\u5176\u4ed6\u5e94\u7528\u4e0a\u5f97\u5230\u4f53\u73b0\u3002\u4f8b\u5982\uff0c\u53cc\u5411\u961f\u5217\u9002\u5408\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u7ef4\u62a4\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u59cb\u7ec8\u6307\u5411\u5934\u7ed3\u70b9\u3001\u5c3e\u7ed3\u70b9\uff0c\u6bcf\u6b21\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

    \u56fe\u7247\u201c\u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f\u201d\u4e2d\uff0c\u6d45\u84dd\u8272\u7684\u5b58\u50a8\u7ed3\u70b9\u6307\u9488\u662f\u5360\u7528\u4e00\u5757\u5185\u5b58\u5730\u5740\u5417\uff1f\u8fd8\u662f\u548c\u7ed3\u70b9\u503c\u5404\u5360\u4e00\u534a\u5462\uff1f

    \u6587\u4e2d\u53ea\u662f\u4e00\u4e2a\u793a\u610f\u56fe\uff0c\u53ea\u662f\u5b9a\u6027\u8868\u793a\u3002\u5b9a\u91cf\u7684\u8bdd\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u5206\u6790\uff1a

    • \u4e0d\u540c\u7c7b\u578b\u7684\u7ed3\u70b9\u503c\u5360\u7528\u7684\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int, long, double, \u6216\u8005\u662f\u7c7b\u7684\u5b9e\u4f8b\u7b49\u7b49\u3002
    • \u6307\u9488\u53d8\u91cf\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f\u6839\u636e\u6240\u4f7f\u7528\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ca\u7f16\u8bd1\u73af\u5883\u800c\u5b9a\uff0c\u5927\u591a\u4e3a 8 \u5b57\u8282\u6216 4 \u5b57\u8282\u3002

    \u5728\u5217\u8868\u672b\u5c3e\u6dfb\u52a0\u5143\u7d20\u662f\u5426\u65f6\u65f6\u523b\u523b\u90fd\u4e3a \\(O(1)\\) \uff1f

    \u5982\u679c\u6dfb\u52a0\u5143\u7d20\u65f6\u8d85\u51fa\u5217\u8868\u957f\u5ea6\uff0c\u5219\u9700\u8981\u5148\u6269\u5bb9\u5217\u8868\u518d\u6dfb\u52a0\u3002\u7cfb\u7edf\u4f1a\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u5185\u5b58\uff0c\u5e76\u5c06\u539f\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u642c\u8fd0\u8fc7\u53bb\uff0c\u8fd9\u65f6\u5019\u65f6\u95f4\u590d\u6742\u5ea6\u5c31\u4f1a\u662f \\(O(n)\\) \u3002

    \u201c\u5217\u8868\u7684\u51fa\u73b0\u5927\u5927\u63d0\u5347\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u526f\u4f5c\u7528\u662f\u4f1a\u9020\u6210\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u201d\uff0c\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u662f\u6307\u989d\u5916\u589e\u52a0\u7684\u53d8\u91cf\u5982\u5bb9\u91cf\u3001\u957f\u5ea6\u3001\u6269\u5bb9\u500d\u6570\u6240\u5360\u7684\u5185\u5b58\u5417\uff1f

    \u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u4e3b\u8981\u6709\u4e24\u65b9\u9762\u542b\u4e49\uff1a\u4e00\u65b9\u9762\uff0c\u5217\u8868\u90fd\u4f1a\u8bbe\u5b9a\u4e00\u4e2a\u521d\u59cb\u957f\u5ea6\uff0c\u6211\u4eec\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u8fd9\u4e48\u591a\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u4e3a\u4e86\u9632\u6b62\u9891\u7e41\u6269\u5bb9\uff0c\u6269\u5bb9\u4e00\u822c\u90fd\u4f1a\u4e58\u4ee5\u4e00\u4e2a\u7cfb\u6570\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u8fd9\u6837\u4e00\u6765\uff0c\u4e5f\u4f1a\u51fa\u73b0\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6ee1\u5b83\u4eec\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/","title":"12.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

    \u7ed9\u5b9a\u4e00\u4e2a\u4e8c\u53c9\u6811\uff0c\u641c\u7d22\u5e76\u8bb0\u5f55\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8fd4\u56de\u8282\u70b9\u5217\u8868\u3002

    \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_traversal_i_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\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_traversal_i_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\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_traversal_i_compact.py
    def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00\"\"\"\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_traversal_i_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\nif root == nil {\nreturn\n}\nif int(root.Val) == 7 {\n// \u8bb0\u5f55\u89e3\n*res = append(*res, root)\n}\npreOrderI(root.Left, res)\npreOrderI(root.Right, res)\n}\n
    preorder_traversal_i_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root, res) {\nif (root === null) {\nreturn;\n}\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push(root);\n}\npreOrder(root.left, res);\npreOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\nif (root === null) {\nreturn;\n}\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push(root);\n}\npreOrder(root.left, res);\npreOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.c
    [class]{}-[func]{preOrder}\n
    preorder_traversal_i_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\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_traversal_i_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\nif root.val == 7 {\n// \u8bb0\u5f55\u89e3\nres.append(root)\n}\npreOrder(root: root.left)\npreOrder(root: root.right)\n}\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n

    Fig. \u5728\u524d\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u8282\u70b9

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1211","title":"12.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

    \u4f8b\u9898\u4e8c

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

    \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_traversal_ii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\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_traversal_ii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\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_traversal_ii_compact.py
    def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c\"\"\"\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_traversal_ii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\nif root == nil {\nreturn\n}\n// \u5c1d\u8bd5\n*path = append(*path, root)\nif int(root.Val) == 7 {\n// \u8bb0\u5f55\u89e3\n*res = append(*res, *path)\n}\npreOrderII(root.Left, res, path)\npreOrderII(root.Right, res, path)\n// \u56de\u9000\n*path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_ii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(root, path, res) {\nif (root === null) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_ii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(\nroot: TreeNode | null,\npath: TreeNode[],\nres: TreeNode[][]\n): void {\nif (root === null) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_ii_compact.c
    [class]{}-[func]{preOrder}\n
    preorder_traversal_ii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\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 List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_ii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrder(root: TreeNode?) {\nguard let root = root else {\nreturn\n}\n// \u5c1d\u8bd5\npath.append(root)\nif root.val == 7 {\n// \u8bb0\u5f55\u89e3\nres.append(path)\n}\npreOrder(root: root.left)\npreOrder(root: root.right)\n// \u56de\u9000\npath.removeLast()\n}\n
    preorder_traversal_ii_compact.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/#1212","title":"12.1.2. \u00a0 \u526a\u679d","text":"

    \u590d\u6742\u7684\u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u7ea6\u675f\u6761\u4ef6\u901a\u5e38\u53ef\u7528\u4e8e\u201c\u526a\u679d\u201d\u3002

    \u4f8b\u9898\u4e09

    \u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\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\u3002

    \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_traversal_iii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\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_traversal_iii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\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_traversal_iii_compact.py
    def pre_order(root: TreeNode) -> None:\n\"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09\"\"\"\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_traversal_iii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n// \u526a\u679d\nif root == nil || root.Val == 3 {\nreturn\n}\n// \u5c1d\u8bd5\n*path = append(*path, root)\nif int(root.Val) == 7 {\n// \u8bb0\u5f55\u89e3\n*res = append(*res, *path)\n}\npreOrderIII(root.Left, res, path)\npreOrderIII(root.Right, res, path)\n// \u56de\u9000\n*path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_iii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(root, path, res) {\n// \u526a\u679d\nif (root === null || root.val === 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_iii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(\nroot: TreeNode | null,\npath: TreeNode[],\nres: TreeNode[][]\n): void {\n// \u526a\u679d\nif (root === null || root.val === 3) {\nreturn;\n}\n// \u5c1d\u8bd5\npath.push(root);\nif (root.val === 7) {\n// \u8bb0\u5f55\u89e3\nres.push([...path]);\n}\npreOrder(root.left, path, res);\npreOrder(root.right, path, res);\n// \u56de\u9000\npath.pop();\n}\n
    preorder_traversal_iii_compact.c
    [class]{}-[func]{preOrder}\n
    preorder_traversal_iii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\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 List<TreeNode>(path));\n}\npreOrder(root.left);\npreOrder(root.right);\n// \u56de\u9000\npath.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_iii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrder(root: TreeNode?) {\n// \u526a\u679d\nguard let root = root, root.val != 3 else {\nreturn\n}\n// \u5c1d\u8bd5\npath.append(root)\nif root.val == 7 {\n// \u8bb0\u5f55\u89e3\nres.append(path)\n}\npreOrder(root: root.left)\npreOrder(root: root.right)\n// \u56de\u9000\npath.removeLast()\n}\n
    preorder_traversal_iii_compact.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/#1213","title":"12.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/#1214","title":"12.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

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (Choice choice : choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (Choice choice : choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    def backtrack(state: State, choices: list[choice], res: list[state]) -> None:\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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif isSolution(state) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor _, choice := range choices {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (let choice of choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (let choice of choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res, numRes);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < numChoices; i++) {\n// \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif (isValid(state, &choices[i])) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state, &choices[i]);\nbacktrack(state, choices, numChoices, res, numRes);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state, &choices[i]);\n}\n}\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nforeach (Choice choice in choices) {\n// \u526a\u679d\uff1a\u5224\u65ad\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, choices, 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
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n// \u5224\u65ad\u662f\u5426\u4e3a\u89e3\nif isSolution(state: state) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state: state, res: &res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices {\n// \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif isValid(state: state, choice: choice) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state: &state, choice: choice)\nbacktrack(state: &state, choices: choices, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state: &state, choice: choice)\n}\n}\n}\n
    \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 preorder_traversal_iii_template.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\uff1a\u4f8b\u9898\u4e09 */\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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\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
    preorder_traversal_iii_template.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\uff1a\u4f8b\u9898\u4e09 */\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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\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
    preorder_traversal_iii_template.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(\nstate: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09\"\"\"\n# \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\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)\n# \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\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
    preorder_traversal_iii_template.go
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\nreturn len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n*res = append(*res, *state)\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\nreturn choice != nil && choice.Val != 3\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n*state = append(*state, choice)\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n*state = (*state)[:len(*state)-1]\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif isSolution(state) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor _, choice := range *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)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\ntemp := make([]*TreeNode, 0)\ntemp = append(temp, choice.Left, choice.Right)\nbacktrackIII(state, &temp, 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
    preorder_traversal_iii_template.js
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state) {\nreturn state && state[state.length - 1]?.val === 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state, res) {\nres.push([...state]);\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\nreturn choice !== null && choice.val !== 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state, choice) {\nstate.push(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state) {\nstate.pop();\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(state, choices, 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 (const choice of 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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, [choice.left, choice.right], res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state);\n}\n}\n}\n
    preorder_traversal_iii_template.ts
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\nreturn state && state[state.length - 1]?.val === 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\nres.push([...state]);\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\nreturn choice !== null && choice.val !== 3;\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\nstate.push(choice);\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state: TreeNode[]): void {\nstate.pop();\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(\nstate: TreeNode[],\nchoices: TreeNode[],\nres: TreeNode[][]\n): void {\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 (const choice of 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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, [choice.left, choice.right], res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state);\n}\n}\n}\n
    preorder_traversal_iii_template.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
    preorder_traversal_iii_template.cs
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state) {\nreturn state.Count != 0 && state[^1].val == 7;\n}\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\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) {\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.RemoveAt(state.Count - 1);\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif (isSolution(state)) {\n// \u8bb0\u5f55\u89e3\nrecordSolution(state, res);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nforeach (TreeNode choice in 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);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, new List<TreeNode> { 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
    preorder_traversal_iii_template.swift
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n!state.isEmpty && state.last!.val == 7\n}\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\nres.append(state)\n}\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\nchoice != nil && choice!.val != 3\n}\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\nstate.append(choice)\n}\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\nstate.removeLast()\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n// \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\nif isSolution(state: state) {\nrecordSolution(state: state, res: &res)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor choice in choices {\n// \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\nif isValid(state: state, choice: choice) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nmakeChoice(state: &state, choice: choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nundoChoice(state: &state, choice: choice)\n}\n}\n}\n
    preorder_traversal_iii_template.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\u3002\u5b9e\u9645\u4e0a\uff0c\u6240\u6709\u56de\u6eaf\u95ee\u9898\u90fd\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u9700\u8981\u6839\u636e\u5177\u4f53\u95ee\u9898\u6765\u5b9a\u4e49 state \u548c choices \uff0c\u5e76\u5b9e\u73b0\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u65b9\u6cd5\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1215","title":"12.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_backtracking/n_queens_problem/","title":"12.3. \u00a0 N \u7687\u540e\u95ee\u9898","text":"

    Question

    \u6839\u636e\u56fd\u9645\u8c61\u68cb\u7684\u89c4\u5219\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u51fb\u4e0e\u4e4b\u5904\u5728\u540c\u4e00\u884c\u6216\u540c\u4e00\u5217\u6216\u540c\u4e00\u659c\u7ebf\u4e0a\u7684\u68cb\u5b50\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u7687\u540e\u548c\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5bfb\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u95f4\u65e0\u6cd5\u76f8\u4e92\u653b\u51fb\u7684\u6446\u653e\u65b9\u6848\u3002

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5f53 \\(n = 4\\) \u65f6\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u4e24\u4e2a\u89e3\u3002\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\u5171\u6709 \\(n^2\\) \u4e2a\u683c\u5b50\uff0c\u7ed9\u51fa\u4e86\u6240\u6709\u7684\u9009\u62e9 choices \u3002\u5728\u9010\u4e2a\u653e\u7f6e\u7687\u540e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u68cb\u76d8\u72b6\u6001\u5728\u4e0d\u65ad\u5730\u53d8\u5316\uff0c\u6bcf\u4e2a\u65f6\u523b\u7684\u68cb\u76d8\u5c31\u662f\u72b6\u6001 state \u3002

    Fig. 4 \u7687\u540e\u95ee\u9898\u7684\u89e3

    \u672c\u9898\u5171\u6709\u4e09\u4e2a\u7ea6\u675f\u6761\u4ef6\uff1a\u591a\u4e2a\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u548c\u540c\u4e00\u5bf9\u89d2\u7ebf\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u89d2\u7ebf\u5206\u4e3a\u4e3b\u5bf9\u89d2\u7ebf \\ \u548c\u526f\u5bf9\u89d2\u7ebf / \u4e24\u79cd\u3002

    Fig. n \u7687\u540e\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6

    \u7687\u540e\u7684\u6570\u91cf\u548c\u68cb\u76d8\u7684\u884c\u6570\u90fd\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u6211\u4eec\u5bb9\u6613\u5f97\u5230\u7b2c\u4e00\u4e2a\u63a8\u8bba\uff1a\u68cb\u76d8\u6bcf\u884c\u90fd\u5141\u8bb8\u4e14\u53ea\u5141\u8bb8\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002\u8fd9\u610f\u5473\u7740\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u4ece\u7b2c\u4e00\u884c\u5f00\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\uff0c\u76f4\u81f3\u6700\u540e\u4e00\u884c\u7ed3\u675f\u3002\u6b64\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73b0\u591a\u4e2a\u7687\u540e\u7684\u6240\u6709\u641c\u7d22\u5206\u652f\u3002

    \u4e0b\u56fe\u5c55\u793a\u4e86 \\(4\\) \u7687\u540e\u95ee\u9898\u7684\u9010\u884c\u653e\u7f6e\u8fc7\u7a0b\u3002\u53d7\u7bc7\u5e45\u9650\u5236\uff0c\u4e0b\u56fe\u4ec5\u5c55\u5f00\u4e86\u7b2c\u4e00\u884c\u7684\u4e00\u4e2a\u641c\u7d22\u5206\u652f\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u4e0d\u6ee1\u8db3\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u65b9\u6848\u90fd\u526a\u679d\u4e86\u3002

    Fig. \u9010\u884c\u653e\u7f6e\u7b56\u7565

    \u4e3a\u4e86\u5b9e\u73b0\u6839\u636e\u5217\u7ea6\u675f\u526a\u679d\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5e03\u5c14\u578b\u6570\u7ec4 cols \u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u51b3\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u4eec\u901a\u8fc7 cols \u5c06\u5df2\u6709\u7687\u540e\u7684\u5217\u526a\u679d\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u52a8\u6001\u66f4\u65b0 cols \u7684\u72b6\u6001\u3002

    \u90a3\u4e48\uff0c\u5982\u4f55\u5904\u7406\u5bf9\u89d2\u7ebf\u7ea6\u675f\u5462\uff1f\u8bbe\u68cb\u76d8\u4e2d\u67d0\u4e2a\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a (row, col) \uff0c\u89c2\u5bdf\u77e9\u9635\u7684\u67d0\u6761\u4e3b\u5bf9\u89d2\u7ebf\uff0c\u6211\u4eec\u53d1\u73b0\u8be5\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u51cf\u5217\u7d22\u5f15\u76f8\u7b49\uff0c\u5373 row - col \u4e3a\u6052\u5b9a\u503c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u82e5\u4e24\u4e2a\u683c\u5b50\u6ee1\u8db3 row1 - col1 == row2 - col2 \uff0c\u5219\u8fd9\u4e24\u4e2a\u683c\u5b50\u4e00\u5b9a\u5904\u5728\u4e00\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u3002

    \u5229\u7528\u8be5\u6027\u8d28\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u4e00\u4e2a\u6570\u7ec4 diag1 \u6765\u8bb0\u5f55\u6bcf\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002\u6ce8\u610f\uff0c\\(n\\) \u7ef4\u65b9\u9635 row - col \u7684\u8303\u56f4\u662f \\([-n + 1, n - 1]\\) \uff0c\u56e0\u6b64\u5171\u6709 \\(2n - 1\\) \u6761\u4e3b\u5bf9\u89d2\u7ebf\u3002

    Fig. \u5904\u7406\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f

    \u540c\u7406\uff0c\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 row + col \u662f\u6052\u5b9a\u503c\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u540c\u6837\u7684\u65b9\u6cd5\uff0c\u501f\u52a9\u6570\u7ec4 diag2 \u6765\u5904\u7406\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u4fbf\u53ef\u4ee5\u5199\u51fa \\(n\\) \u7687\u540e\u7684\u89e3\u9898\u4ee3\u7801\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig n_queens.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\nboolean[] cols, boolean[] diags1, boolean[] diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row == n) {\nList<List<String>> copyState = new ArrayList<>();\nfor (List<String> sRow : state) {\ncopyState.add(new ArrayList<>(sRow));\n}\nres.add(copyState);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (int col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nint diag1 = row - col + n - 1;\nint diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate.get(row).set(col, \"Q\");\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate.get(row).set(col, \"#\");\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nList<List<String>> state = new ArrayList<>();\nfor (int i = 0; i < n; i++) {\nList<String> row = new ArrayList<>();\nfor (int j = 0; j < n; j++) {\nrow.add(\"#\");\n}\nstate.add(row);\n}\nboolean[] cols = new boolean[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nboolean[] diags1 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nboolean[] diags2 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nList<List<List<String>>> res = new ArrayList<>();\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\nvector<bool> &diags1, vector<bool> &diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row == n) {\nres.push_back(state);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (int col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nint diag1 = row - col + n - 1;\nint diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\";\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\";\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nvector<vector<string>> state(n, vector<string>(n, \"#\"));\nvector<bool> cols(n, false);           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nvector<bool> diags1(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvector<bool> diags2(2 * n - 1, false); // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvector<vector<vector<string>>> res;\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.py
    def backtrack(\nrow: int,\nn: int,\nstate: list[list[str]],\nres: list[list[list[str]]],\ncols: list[bool],\ndiags1: list[bool],\ndiags2: list[bool],\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e\"\"\"\n# \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n:\nres.append([list(row) for row in state])\nreturn\n# \u904d\u5386\u6240\u6709\u5217\nfor col in range(n):\n# \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\ndiag1 = row - col + n - 1\ndiag2 = row + col\n# \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif not (cols[col] or diags1[diag1] or diags2[diag2]):\n# \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\"\ncols[col] = diags1[diag1] = diags2[diag2] = True\n# \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2)\n# \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\"\ncols[col] = diags1[diag1] = diags2[diag2] = False\ndef n_queens(n: int) -> list[list[list[str]]]:\n\"\"\"\u6c42\u89e3 N \u7687\u540e\"\"\"\n# \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nstate = [[\"#\" for _ in range(n)] for _ in range(n)]\ncols = [False] * n  # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\ndiags1 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\ndiags2 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nres = []\nbacktrack(0, n, state, res, cols, diags1, diags2)\nreturn res\n
    n_queens.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n {\nnewState := make([][]string, len(*state))\nfor i, _ := range newState {\nnewState[i] = make([]string, len((*state)[0]))\ncopy(newState[i], (*state)[i])\n}\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor col := 0; col < n; col++ {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\ndiag1 := row - col + n - 1\ndiag2 := row + col\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif !((*cols)[col] || (*diags1)[diag1] || (*diags2)[diag2]) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n(*state)[row][col] = \"Q\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row+1, n, state, res, cols, diags1, diags2)\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n(*state)[row][col] = \"#\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n}\n}\n}\n/* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n {\nnewState := make([][]string, len(*state))\nfor i, _ := range newState {\nnewState[i] = make([]string, len((*state)[0]))\ncopy(newState[i], (*state)[i])\n}\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor col := 0; col < n; col++ {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\ndiag1 := row - col + n - 1\ndiag2 := row + col\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif !((*cols)[col] || (*diags1)[diag1] || (*diags2)[diag2]) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n(*state)[row][col] = \"Q\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row+1, n, state, res, cols, diags1, diags2)\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n(*state)[row][col] = \"#\"\n(*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n}\n}\n}\nfunc nQueens(n int) [][][]string {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nstate := make([][]string, n)\nfor i := 0; i < n; i++ {\nrow := make([]string, n)\nfor i := 0; i < n; i++ {\nrow[i] = \"#\"\n}\nstate[i] = row\n}\n// \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\ncols := make([]bool, n)\ndiags1 := make([]bool, 2*n-1)\ndiags2 := make([]bool, 2*n-1)\nres := make([][][]string, 0)\nbacktrack(0, n, &state, &res, &cols, &diags1, &diags2)\nreturn res\n}\n
    n_queens.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row === n) {\nres.push(state.map((row) => row.slice()));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (let col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nconst diag1 = row - col + n - 1;\nconst diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = 'Q';\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = '#';\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nfunction nQueens(n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nconst state = Array.from({ length: n }, () => Array(n).fill('#'));\nconst cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nconst diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst res = [];\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunction backtrack(\nrow: number,\nn: number,\nstate: string[][],\nres: string[][][],\ncols: boolean[],\ndiags1: boolean[],\ndiags2: boolean[]\n): void {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row === n) {\nres.push(state.map((row) => row.slice()));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (let col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nconst diag1 = row - col + n - 1;\nconst diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = 'Q';\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = '#';\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nconst state = Array.from({ length: n }, () => Array(n).fill('#'));\nconst cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nconst diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nconst res: string[][][] = [];\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.c
    [class]{}-[func]{backtrack}\n[class]{}-[func]{nQueens}\n
    n_queens.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nvoid backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\nbool[] cols, bool[] diags1, bool[] diags2) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (row == n) {\nList<List<string>> copyState = new List<List<string>>();\nforeach (List<string> sRow in state) {\ncopyState.Add(new List<string>(sRow));\n}\nres.Add(copyState);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor (int col = 0; col < n; col++) {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nint diag1 = row - col + n - 1;\nint diag2 = row + col;\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif (!(cols[col] || diags1[diag1] || diags2[diag2])) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\";\ncols[col] = diags1[diag1] = diags2[diag2] = true;\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row + 1, n, state, res, cols, diags1, diags2);\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\";\ncols[col] = diags1[diag1] = diags2[diag2] = false;\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nList<List<List<string>>> nQueens(int n) {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nList<List<string>> state = new List<List<string>>();\nfor (int i = 0; i < n; i++) {\nList<string> row = new List<string>();\nfor (int j = 0; j < n; j++) {\nrow.Add(\"#\");\n}\nstate.Add(row);\n}\nbool[] cols = new bool[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nbool[] diags1 = new bool[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nbool[] diags2 = new bool[2 * n - 1]; // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nList<List<List<string>>> res = new List<List<List<string>>>();\nbacktrack(0, n, state, res, cols, diags1, diags2);\nreturn res;\n}\n
    n_queens.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1aN \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n// \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\nif row == n {\nres.append(state)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u5217\nfor col in 0 ..< n {\n// \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u526f\u5bf9\u89d2\u7ebf\nlet diag1 = row - col + n - 1\nlet diag2 = row + col\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728 (\u5217 \u6216 \u4e3b\u5bf9\u89d2\u7ebf \u6216 \u526f\u5bf9\u89d2\u7ebf) \u5305\u542b\u7687\u540e\nif !(cols[col] || diags1[diag1] || diags2[diag2]) {\n// \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\nstate[row][col] = \"Q\"\ncols[col] = true\ndiags1[diag1] = true\ndiags2[diag2] = true\n// \u653e\u7f6e\u4e0b\u4e00\u884c\nbacktrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n// \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\nstate[row][col] = \"#\"\ncols[col] = false\ndiags1[diag1] = false\ndiags2[diag2] = false\n}\n}\n}\n/* \u6c42\u89e3 N \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n// \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\nvar state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\nvar cols = Array(repeating: false, count: n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\nvar diags1 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvar diags2 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u526f\u5bf9\u89d2\u7ebf\u662f\u5426\u6709\u7687\u540e\nvar res: [[[String]]] = []\nbacktrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\nreturn res\n}\n
    n_queens.zig
    [class]{}-[func]{backtrack}\n[class]{}-[func]{nQueens}\n
    "},{"location":"chapter_backtracking/n_queens_problem/#1231","title":"12.3.1. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u8651\u5217\u7ea6\u675f\uff0c\u5219\u4ece\u7b2c\u4e00\u884c\u5230\u6700\u540e\u4e00\u884c\u5206\u522b\u6709 \\(n, n-1, \\cdots, 2, 1\\) \u4e2a\u9009\u62e9\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!)\\) \u3002\u5b9e\u9645\u4e0a\uff0c\u6839\u636e\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u526a\u679d\u4e5f\u80fd\u591f\u5927\u5e45\u5730\u7f29\u5c0f\u641c\u7d22\u7a7a\u95f4\uff0c\u56e0\u800c\u641c\u7d22\u6548\u7387\u5f80\u5f80\u4f18\u4e8e\u4ee5\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff0ccols , diags1 , diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/","title":"12.2. \u00a0 \u5168\u6392\u5217\u95ee\u9898","text":"

    \u5168\u6392\u5217\u95ee\u9898\u662f\u56de\u6eaf\u7b97\u6cd5\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u7684\u5b9a\u4e49\u662f\u5728\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff08\u5982\u4e00\u4e2a\u6570\u7ec4\u6216\u5b57\u7b26\u4e32\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u627e\u51fa\u8fd9\u4e2a\u96c6\u5408\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u5982\u4e0b\u8868\u6240\u793a\uff0c\u5217\u4e3e\u4e86\u51e0\u4e2a\u793a\u4f8b\u6570\u7ec4\u548c\u5176\u5bf9\u5e94\u7684\u6240\u6709\u6392\u5217\u3002

    \u8f93\u5165\u6570\u7ec4 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1221","title":"12.2.1. \u00a0 \u65e0\u91cd\u590d\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\u3002\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u4eec\u5148\u9009\u62e9 \\(1\\) \u3001\u518d\u9009\u62e9 \\(3\\) \u3001\u6700\u540e\u9009\u62e9 \\(2\\) \uff0c\u5219\u83b7\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u9500\u4e00\u4e2a\u9009\u62e9\uff0c\u4e4b\u540e\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002

    \u4ece\u56de\u6eaf\u7b97\u6cd5\u4ee3\u7801\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9009\u96c6\u5408 choices \u662f\u8f93\u5165\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72b6\u6001 state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9009\u62e9\u7684\u5143\u7d20\u3002\u6ce8\u610f\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u5141\u8bb8\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u56e0\u6b64\u5728\u904d\u5386\u9009\u62e9\u65f6\uff0c\u5e94\u5f53\u6392\u9664\u5df2\u7ecf\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u3002

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u641c\u7d22\u8fc7\u7a0b\u5c55\u5f00\u6210\u4e00\u4e2a\u9012\u5f52\u6811\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u5f53\u524d\u72b6\u6001 state \u3002\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u7ecf\u8fc7\u4e09\u8f6e\u9009\u62e9\u540e\u5230\u8fbe\u53f6\u8282\u70b9\uff0c\u6bcf\u4e2a\u53f6\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u6392\u5217\u3002

    Fig. \u5168\u6392\u5217\u7684\u9012\u5f52\u6811

    \u60f3\u6e05\u695a\u4ee5\u4e0a\u4fe1\u606f\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u4ee3\u7801\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u4e3a\u4e86\u7f29\u77ed\u4ee3\u7801\u884c\u6570\uff0c\u6211\u4eec\u4e0d\u5355\u72ec\u5b9e\u73b0\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5404\u4e2a\u51fd\u6570\uff0c\u800c\u662f\u5c06\u4ed6\u4eec\u5c55\u5f00\u5728 backtrack() \u51fd\u6570\u4e2d\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig permutations_i.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.length) {\nres.add(new ArrayList<Integer>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < choices.length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.remove(state.size() - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\nList<List<Integer>> res = new ArrayList<List<Integer>>();\nbacktrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\nreturn res;\n}\n
    permutations_i.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.size()) {\nres.push_back(state);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < choices.size(); i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.push_back(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop_back();\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\nvector<int> state;\nvector<bool> selected(nums.size(), false);\nvector<vector<int>> res;\nbacktrack(state, nums, selected, res);\nreturn res;\n}\n
    permutations_i.py
    def backtrack(\nstate: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n# \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(state) == len(choices):\nres.append(list(state))\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nfor i, choice in enumerate(choices):\n# \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\nif not selected[i]:\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = True\nstate.append(choice)\n# \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = False\nstate.pop()\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n\"\"\"\u5168\u6392\u5217 I\"\"\"\nres = []\nbacktrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\nreturn res\n
    permutations_i.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(*state) == len(*choices) {\nnewState := append([]int{}, *state...)\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor i := 0; i < len(*choices); i++ {\nchoice := (*choices)[i]\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif !(*selected)[i] {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n(*selected)[i] = true\n*state = append(*state, choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrackI(state, choices, selected, res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n(*selected)[i] = false\n*state = (*state)[:len(*state)-1]\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\nres := make([][]int, 0)\nstate := make([]int, 0)\nselected := make([]bool, len(nums))\nbacktrackI(&state, &nums, &selected, &res)\nreturn res\n}\n
    permutations_i.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\nconst res = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_i.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\nstate: number[],\nchoices: number[],\nselected: boolean[],\nres: number[][]\n): void {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\nconst res: number[][] = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_i.c
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsI}\n
    permutations_i.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.Count == choices.Length) {\nres.Add(new List<int>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (int i = 0; i < choices.Length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i]) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true;\nstate.Add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.RemoveAt(state.Count - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(int[] nums) {\nList<List<int>> res = new List<List<int>>();\nbacktrack(new List<int>(), nums, new bool[nums.Length], res);\nreturn res;\n}\n
    permutations_i.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif state.count == choices.count {\nres.append(state)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nfor (i, choice) in choices.enumerated() {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif !selected[i] {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nselected[i] = true\nstate.append(choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state: &state, choices: choices, selected: &selected, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false\nstate.removeLast()\n}\n}\n}\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\nvar state: [Int] = []\nvar selected = Array(repeating: false, count: nums.count)\nvar res: [[Int]] = []\nbacktrack(state: &state, choices: nums, selected: &selected, res: &res)\nreturn res\n}\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsI}\n

    \u9700\u8981\u91cd\u70b9\u5173\u6ce8\u7684\u662f\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u5e03\u5c14\u578b\u6570\u7ec4 selected \uff0c\u5b83\u7684\u957f\u5ea6\u4e0e\u8f93\u5165\u6570\u7ec4\u957f\u5ea6\u76f8\u7b49\uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9009\u62e9\u3002\u6211\u4eec\u5229\u7528 selected \u907f\u514d\u67d0\u4e2a\u5143\u7d20\u88ab\u91cd\u590d\u9009\u62e9\uff0c\u4ece\u800c\u5b9e\u73b0\u526a\u679d\u3002

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u7b2c\u4e00\u8f6e\u9009\u62e9 1 \uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9 3 \uff0c\u7b2c\u4e09\u8f6e\u9009\u62e9 2 \uff0c\u5219\u9700\u8981\u5728\u7b2c\u4e8c\u8f6e\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f6e\u526a\u6389\u5143\u7d20 1, 3 \u7684\u5206\u652f\u3002\u4ece\u672c\u8d28\u4e0a\u7406\u89e3\uff0c\u6b64\u526a\u679d\u64cd\u4f5c\u53ef\u5c06\u641c\u7d22\u7a7a\u95f4\u5927\u5c0f\u4ece \\(O(n^n)\\) \u964d\u4f4e\u81f3 \\(O(n!)\\) \u3002

    Fig. \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

    "},{"location":"chapter_backtracking/permutations_problem/#1222","title":"12.2.2. \u00a0 \u8003\u8651\u91cd\u590d\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u590d\u7684\u6392\u5217\u3002

    \u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 1, 2]\\) \u3002\u4e3a\u4e86\u65b9\u4fbf\u533a\u5206\u4e24\u4e2a\u91cd\u590d\u7684\u5143\u7d20 \\(1\\) \uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u7b2c\u4e8c\u4e2a\u5143\u7d20\u8bb0\u4e3a \\(\\hat{1}\\) \u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u90fd\u662f\u91cd\u590d\u7684\u3002

    Fig. \u91cd\u590d\u6392\u5217

    \u90a3\u4e48\uff0c\u5982\u4f55\u53bb\u9664\u91cd\u590d\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u76f4\u63a5\u5bf9\u6392\u5217\u7ed3\u679c\u8fdb\u884c\u53bb\u91cd\u3002\u7136\u800c\uff0c\u8fd9\u6837\u505a\u4e0d\u591f\u4f18\u96c5\uff0c\u56e0\u4e3a\u751f\u6210\u91cd\u590d\u6392\u5217\u7684\u641c\u7d22\u5206\u652f\u662f\u6ca1\u6709\u5fc5\u8981\u7684\uff0c\u5e94\u5f53\u88ab\u63d0\u524d\u8bc6\u522b\u5e76\u526a\u679d\uff0c\u8fd9\u6837\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u5728\u7b2c\u4e00\u8f6e\u4e2d\uff0c\u9009\u62e9 \\(1\\) \u6216\u9009\u62e9 \\(\\hat{1}\\) \u662f\u7b49\u4ef7\u7684\uff0c\u56e0\u4e3a\u5728\u8fd9\u4e24\u4e2a\u9009\u62e9\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u590d\u7684\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5e94\u8be5\u628a \\(\\hat{1}\\) \u526a\u679d\u6389\u3002\u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(2\\) \u540e\uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u9700\u8981\u5c06\u7b2c\u4e8c\u8f6e\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

    Fig. \u91cd\u590d\u6392\u5217\u526a\u679d

    \u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u5b9e\u73b0\u5728\u67d0\u4e00\u8f6e\u9009\u62e9\u4e2d\uff0c\u591a\u4e2a\u76f8\u7b49\u7684\u5143\u7d20\u4ec5\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u56e0\u6b64\uff0c\u5728\u4e0a\u4e00\u9898\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u8003\u8651\u5728\u6bcf\u4e00\u8f6e\u9009\u62e9\u4e2d\u5f00\u542f\u4e00\u4e2a\u54c8\u5e0c\u8868 duplicated \uff0c\u7528\u4e8e\u8bb0\u5f55\u8be5\u8f6e\u4e2d\u5df2\u7ecf\u5c1d\u8bd5\u8fc7\u7684\u5143\u7d20\uff0c\u5e76\u5c06\u91cd\u590d\u5143\u7d20\u526a\u679d\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig permutations_ii.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.length) {\nres.add(new ArrayList<Integer>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nSet<Integer> duplicated = new HashSet<Integer>();\nfor (int i = 0; i < choices.length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.contains(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.remove(state.size() - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\nList<List<Integer>> res = new ArrayList<List<Integer>>();\nbacktrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\nreturn res;\n}\n
    permutations_ii.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.size() == choices.size()) {\nres.push_back(state);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nunordered_set<int> duplicated;\nfor (int i = 0; i < choices.size(); i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.emplace(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.push_back(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop_back();\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\nvector<int> state;\nvector<bool> selected(nums.size(), false);\nvector<vector<int>> res;\nbacktrack(state, nums, selected, res);\nreturn res;\n}\n
    permutations_ii.py
    def backtrack(\nstate: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n\"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n# \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(state) == len(choices):\nres.append(list(state))\nreturn\n# \u904d\u5386\u6240\u6709\u9009\u62e9\nduplicated = set[int]()\nfor i, choice in enumerate(choices):\n# \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif not selected[i] and choice not in duplicated:\n# \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice)  # \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = True\nstate.append(choice)\n# \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res)\n# \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = False\nstate.pop()\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n\"\"\"\u5168\u6392\u5217 II\"\"\"\nres = []\nbacktrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\nreturn res\n
    permutations_ii.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif len(*state) == len(*choices) {\nnewState := append([]int{}, *state...)\n*res = append(*res, newState)\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nduplicated := make(map[int]struct{}, 0)\nfor i := 0; i < len(*choices); i++ {\nchoice := (*choices)[i]\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n// \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nduplicated[choice] = struct{}{}\n(*selected)[i] = true\n*state = append(*state, choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrackI(state, choices, selected, res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n(*selected)[i] = false\n*state = (*state)[:len(*state)-1]\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\nres := make([][]int, 0)\nstate := make([]int, 0)\nselected := make([]bool, len(nums))\nbacktrackII(&state, &nums, &selected, &res)\nreturn res\n}\n
    permutations_ii.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nconst duplicated = new Set();\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.has(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\nconst res = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_ii.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\nstate: number[],\nchoices: number[],\nselected: boolean[],\nres: number[][]\n): void {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.length === choices.length) {\nres.push([...state]);\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nconst duplicated = new Set();\nchoices.forEach((choice, i) => {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.has(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.push(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.pop();\n}\n});\n}\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\nconst res: number[][] = [];\nbacktrack([], nums, Array(nums.length).fill(false), res);\nreturn res;\n}\n
    permutations_ii.c
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsII}\n
    permutations_ii.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif (state.Count == choices.Length) {\nres.Add(new List<int>(state));\nreturn;\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nISet<int> duplicated = new HashSet<int>();\nfor (int i = 0; i < choices.Length; i++) {\nint choice = choices[i];\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif (!selected[i] && !duplicated.Contains(choice)) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.Add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true;\nstate.Add(choice);\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state, choices, selected, res);\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false;\nstate.RemoveAt(state.Count - 1);\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(int[] nums) {\nList<List<int>> res = new List<List<int>>();\nbacktrack(new List<int>(), nums, new bool[nums.Length], res);\nreturn res;\n}\n
    permutations_ii.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n// \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\nif state.count == choices.count {\nres.append(state)\nreturn\n}\n// \u904d\u5386\u6240\u6709\u9009\u62e9\nvar duplicated: Set<Int> = []\nfor (i, choice) in choices.enumerated() {\n// \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\nif !selected[i], !duplicated.contains(choice) {\n// \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\nduplicated.insert(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\nselected[i] = true\nstate.append(choice)\n// \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\nbacktrack(state: &state, choices: choices, selected: &selected, res: &res)\n// \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\nselected[i] = false\nstate.removeLast()\n}\n}\n}\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\nvar state: [Int] = []\nvar selected = Array(repeating: false, count: nums.count)\nvar res: [[Int]] = []\nbacktrack(state: &state, choices: nums, selected: &selected, res: &res)\nreturn res\n}\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n[class]{}-[func]{permutationsII}\n

    \u6ce8\u610f\uff0c\u867d\u7136 selected \u548c duplicated \u90fd\u8d77\u5230\u526a\u679d\u7684\u4f5c\u7528\uff0c\u4f46\u4ed6\u4eec\u526a\u6389\u7684\u662f\u4e0d\u540c\u7684\u5206\u652f\uff1a

    • \u526a\u679d\u6761\u4ef6\u4e00\uff1a\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\u4e2d\u53ea\u6709\u4e00\u4e2a selected \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5f53\u524d\u72b6\u6001\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u4f5c\u7528\u662f\u907f\u514d\u67d0\u4e2a\u5143\u7d20\u5728 state \u4e2d\u91cd\u590d\u51fa\u73b0\u3002
    • \u526a\u679d\u6761\u4ef6\u4e8c\uff1a\u6bcf\u8f6e\u9009\u62e9\uff08\u5373\u6bcf\u4e2a\u5f00\u542f\u7684 backtrack \u51fd\u6570\uff09\u90fd\u5305\u542b\u4e00\u4e2a duplicated \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5728\u904d\u5386\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9009\u62e9\u8fc7\uff0c\u4f5c\u7528\u662f\u4fdd\u8bc1\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u4ee5\u907f\u514d\u4ea7\u751f\u91cd\u590d\u7684\u641c\u7d22\u5206\u652f\u3002

    \u4e0b\u56fe\u5c55\u793a\u4e86\u4e24\u4e2a\u526a\u679d\u6761\u4ef6\u7684\u751f\u6548\u8303\u56f4\u3002\u6ce8\u610f\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u9009\u62e9\uff0c\u4ece\u6839\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\u6784\u6210\u4e00\u4e2a\u6392\u5217\u3002

    Fig. \u4e24\u79cd\u526a\u679d\u6761\u4ef6\u7684\u4f5c\u7528\u8303\u56f4

    "},{"location":"chapter_backtracking/permutations_problem/#1223","title":"12.2.3. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u5047\u8bbe\u5143\u7d20\u4e24\u4e24\u4e4b\u95f4\u4e92\u4e0d\u76f8\u540c\uff0c\u5219 \\(n\\) \u4e2a\u5143\u7d20\u5171\u6709 \\(n!\\) \u79cd\u6392\u5217\uff08\u9636\u4e58\uff09\uff1b\u5728\u8bb0\u5f55\u7ed3\u679c\u65f6\uff0c\u9700\u8981\u590d\u5236\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5217\u8868\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u56e0\u6b64\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!n)\\) \u3002

    \u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u540c\u4e00\u65f6\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u4e2a duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u5168\u6392\u5217 I \u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5168\u6392\u5217 II \u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \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 = 0                 # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\nb = 0                 # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\nnode = Node(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
    /* \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 = 0                     # O(1)\nb = [0] * 10000     # O(1)\nif n > 10:\nnums = [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 = 0\nnums = [0] * 10000\nnode = ListNode(0)\n# \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\nfor _ in range(n):\nc = 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// \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++) {\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.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 = [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};\ntypedef struct hashTable hashTable;\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// \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++) {\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++) {\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) {\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 = [[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// \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++) {\nList<int> tmp = new();\nfor (int j = 0; j < n; j++) {\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 = [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) {\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) {\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/summary/#241-q-a","title":"2.4.1. \u00a0 Q & A","text":"

    \u5c3e\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u5417\uff1f

    \u7406\u8bba\u4e0a\uff0c\u5c3e\u9012\u5f52\u51fd\u6570\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u88ab\u4f18\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u8fc7\u7edd\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java, Python, C++, Go, C# \u7b49\uff09 \u90fd\u4e0d\u652f\u6301\u81ea\u52a8\u4f18\u5316\u5c3e\u9012\u5f52\uff0c\u56e0\u6b64\u4e00\u822c\u6765\u8bf4\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \u3002

    \u51fd\u6570\u548c\u65b9\u6cd5\u8fd9\u4e24\u4e2a\u672f\u8bed\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f

    \u51fd\u6570\uff08function\uff09\u53ef\u4ee5\u72ec\u7acb\u88ab\u6267\u884c\uff0c\u6240\u6709\u53c2\u6570\u90fd\u4ee5\u663e\u5f0f\u4f20\u9012\u3002 \u65b9\u6cd5\uff08method\uff09\u4e0e\u4e00\u4e2a\u5bf9\u8c61\u5173\u8054\uff0c\u65b9\u6cd5\u88ab\u9690\u5f0f\u4f20\u9012\u7ed9\u8c03\u7528\u5b83\u7684\u5bf9\u8c61\uff0c\u65b9\u6cd5\u80fd\u591f\u5bf9\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u5305\u542b\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u3002

    \u56fe\u7247\u201c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u89c1\u7c7b\u578b\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\uff1f

    \u4e0d\u662f\uff0c\u8be5\u56fe\u7247\u5c55\u793a\u7684\u662f\u7a7a\u95f4\u590d\u6742\u5ea6\uff08\u5373\u589e\u957f\u8d8b\u52bf\uff09\uff0c\u800c\u4e0d\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\u3002\u6bcf\u4e2a\u66f2\u7ebf\u90fd\u5305\u542b\u4e00\u4e2a\u5e38\u6570\u9879\uff0c\u7528\u6765\u628a\u6240\u6709\u66f2\u7ebf\u7684\u53d6\u503c\u8303\u56f4\u538b\u7f29\u5230\u4e00\u4e2a\u89c6\u89c9\u8212\u9002\u7684\u8303\u56f4\u5185\u3002 \u5b9e\u9645\u4e2d\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u4e2a\u65b9\u6cd5\u7684\u201c\u5e38\u6570\u9879\u201d\u590d\u6742\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u65e0\u6cd5\u4ec5\u51ed\u590d\u6742\u5ea6\u6765\u9009\u62e9 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u4f18\u89e3\u6cd5\uff1b\u4f46\u76f8\u5bf9\u5730 \\(n = 8^5\\) \u5c31\u5f88\u597d\u9009\u4e86\uff0c\u8fd9\u662f\u590d\u6742\u5ea6\u5360\u4e3b\u5bfc\u7684\u60c5\u51b5\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 = 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 = 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 = 0\nsize = 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) {\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 = 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) {\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 = 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) {\nint count = 0;\n// \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\nforeach (int num in nums) {\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 = 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) {\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.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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = 0  # \u8ba1\u6570\u5668\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in range(len(nums) - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = n - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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) {\nint count = 0;  // \u8ba1\u6570\u5668\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.Length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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.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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nvar i: i32 = @intCast(i32, nums.len ) - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = 0\nbase = 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) {\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++) {\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.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) {\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 = 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) {\nint count = 0;\nwhile (n > 1) {\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) {\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) {\nif (n <= 1) return 1;\nint count = linearLogRecur(n / 2) +\nlinearLogRecur(n / 2);\nfor (int i = 0; i < n; i++) {\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 = 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) {\nif (n == 0) return 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.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 = [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) {\nint[] nums = new int[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\nfor (int i = 0; i < nums.Length; i++) {\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) {\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.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/basic_data_types/","title":"3.2. \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

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

    • \u6574\u6570\u7c7b\u578b byte , short , int , long \uff1b
    • \u6d6e\u70b9\u6570\u7c7b\u578b float , double \uff0c\u7528\u4e8e\u8868\u793a\u5c0f\u6570\uff1b
    • \u5b57\u7b26\u7c7b\u578b char \uff0c\u7528\u4e8e\u8868\u793a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u6bcd\u3001\u6807\u70b9\u7b26\u53f7\u3001\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\uff1b
    • \u5e03\u5c14\u7c7b\u578b bool \uff0c\u7528\u4e8e\u8868\u793a\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\u5224\u65ad\uff1b

    \u6240\u6709\u57fa\u672c\u6570\u636e\u7c7b\u578b\u90fd\u4ee5\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u3002\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6211\u4eec\u5c06 \\(1\\) \u4e2a\u4e8c\u8fdb\u5236\u4f4d\u79f0\u4e3a \\(1\\) \u6bd4\u7279\uff0c\u5e76\u89c4\u5b9a \\(1\\) \u5b57\u8282\uff08byte\uff09\u7531 \\(8\\) \u6bd4\u7279\uff08bits\uff09\u7ec4\u6210\u3002\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5176\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\uff0c\u4f8b\u5982\uff1a

    • \u6574\u6570\u7c7b\u578b byte \u5360\u7528 \\(1\\) byte = \\(8\\) bits \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u4e2a\u4e0d\u540c\u7684\u6570\u5b57\uff1b
    • \u6574\u6570\u7c7b\u578b int \u5360\u7528 \\(4\\) bytes = \\(32\\) bits \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u6570\u5b57\uff1b

    \u4e0b\u8868\u5217\u4e3e\u4e86\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u3002\u6b64\u8868\u683c\u65e0\u9700\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

    \u7c7b\u578b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 byte \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 bytes \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 bytes \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 bytes \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u70b9\u6570 float 4 bytes \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0 f\\) double 8 bytes \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 bytes / 1 byte \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 byte \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    Tip

    \u5b57\u7b26\u7684\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u53d6\u51b3\u4e8e\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\uff0c\u8be6\u89c1\u300c\u5b57\u7b26\u7f16\u7801\u300d\u7ae0\u8282\u3002

    \u73b0\u4ee3\u8ba1\u7b97\u673a CPU \u901a\u5e38\u5c06 1 \u5b57\u8282\u4f5c\u4e3a\u6700\u5c0f\u5bfb\u5740\u5185\u5b58\u5355\u5143\u3002\u56e0\u6b64\uff0c\u5373\u4f7f\u8868\u793a\u5e03\u5c14\u91cf\u4ec5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u5185\u5b58\u4e2d\u901a\u5e38\u88ab\u5b58\u50a8\u4e3a 1 \u5b57\u8282\u3002

    \u90a3\u4e48\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u95f4\u6709\u4ec0\u4e48\u8054\u7cfb\u4e0e\u533a\u522b\u5462\uff1f\u6211\u4eec\u77e5\u9053\uff0c\u6570\u636e\u7ed3\u6784\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u4e0e\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u5b83\u7684\u4e3b\u8bed\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\u6570\u7ec4\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u7684\u7ebf\u6027\u7ed3\u6784\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u548c\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5b58\u50a8\u7684\u5185\u5bb9\u662f\u6574\u6570 int \u3001\u5c0f\u6570 float \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\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e0d\u540c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\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/character_encoding/","title":"3.4. \u00a0 \u5b57\u7b26\u7f16\u7801 *","text":"

    \u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6240\u6709\u6570\u636e\u90fd\u662f\u4ee5\u4e8c\u8fdb\u5236\u6570\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\uff0c\u5b57\u7b26 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u4e3a\u4e86\u8868\u793a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u5efa\u7acb\u4e00\u5957\u300c\u5b57\u7b26\u96c6\u300d\uff0c\u89c4\u5b9a\u6bcf\u4e2a\u5b57\u7b26\u548c\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u540e\uff0c\u8ba1\u7b97\u673a\u5c31\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u5b8c\u6210\u4e8c\u8fdb\u5236\u6570\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1. \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

    \u300cASCII \u7801\u300d\u662f\u6700\u65e9\u51fa\u73b0\u7684\u5b57\u7b26\u96c6\uff0c\u5168\u79f0\u4e3a\u201c\u7f8e\u56fd\u6807\u51c6\u4fe1\u606f\u4ea4\u6362\u4ee3\u7801\u201d\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u8fdb\u5236\u6570\uff08\u5373\u4e00\u4e2a\u5b57\u8282\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6700\u591a\u80fd\u591f\u8868\u793a 128 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u8fd9\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\u3001\u6570\u5b57 0-9 \u3001\u4e00\u4e9b\u6807\u70b9\u7b26\u53f7\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u7b26\uff08\u5982\u6362\u884c\u7b26\u548c\u5236\u8868\u7b26\uff09\u3002

    Fig. ASCII \u7801

    \u7136\u800c\uff0cASCII \u7801\u4ec5\u80fd\u591f\u8868\u793a\u82f1\u6587\u3002\u968f\u7740\u8ba1\u7b97\u673a\u7684\u5168\u7403\u5316\uff0c\u8bde\u751f\u4e86\u4e00\u79cd\u80fd\u591f\u8868\u793a\u66f4\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u96c6\u300cEASCII\u300d\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u7840\u4e0a\u6269\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u591f\u8868\u793a 256 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u5728\u4e16\u754c\u8303\u56f4\u5185\uff0c\u9646\u7eed\u51fa\u73b0\u4e86\u4e00\u6279\u9002\u7528\u4e8e\u4e0d\u540c\u5730\u533a\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u8fd9\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u4e2a\u5b57\u7b26\u7edf\u4e00\u4e3a ASCII \u7801\uff0c\u540e 128 \u4e2a\u5b57\u7b26\u5b9a\u4e49\u4e0d\u540c\uff0c\u4ee5\u9002\u5e94\u4e0d\u540c\u8bed\u8a00\u7684\u9700\u6c42\u3002

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2. \u00a0 GBK \u5b57\u7b26\u96c6","text":"

    \u540e\u6765\u4eba\u4eec\u53d1\u73b0\uff0cEASCII \u7801\u4ecd\u7136\u65e0\u6cd5\u6ee1\u8db3\u8bb8\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u6570\u91cf\u8981\u6c42\u3002\u4f8b\u5982\uff0c\u6c49\u5b57\u5927\u7ea6\u6709\u8fd1\u5341\u4e07\u4e2a\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u51e0\u5343\u4e2a\u3002\u4e2d\u56fd\u56fd\u5bb6\u6807\u51c6\u603b\u5c40\u4e8e 1980 \u5e74\u53d1\u5e03\u4e86\u300cGB2312\u300d\u5b57\u7b26\u96c6\uff0c\u5176\u6536\u5f55\u4e86 6763 \u4e2a\u6c49\u5b57\uff0c\u57fa\u672c\u6ee1\u8db3\u4e86\u6c49\u5b57\u7684\u8ba1\u7b97\u673a\u5904\u7406\u9700\u8981\u3002

    \u7136\u800c\uff0cGB2312 \u65e0\u6cd5\u5904\u7406\u90e8\u5206\u7684\u7f55\u89c1\u5b57\u548c\u7e41\u4f53\u5b57\u3002\u4e4b\u540e\u5728 GB2312 \u7684\u57fa\u7840\u4e0a\uff0c\u6269\u5c55\u5f97\u5230\u4e86\u300cGBK\u300d\u5b57\u7b26\u96c6\uff0c\u5b83\u5171\u6536\u5f55\u4e86 21886 \u4e2a\u6c49\u5b57\u3002\u5728 GBK \u7f16\u7801\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u7b26\u4f7f\u7528\u4e00\u4e2a\u5b57\u8282\u8868\u793a\uff0c\u6c49\u5b57\u4f7f\u7528\u4e24\u4e2a\u5b57\u8282\u8868\u793a\u3002

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3. \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

    \u968f\u7740\u8ba1\u7b97\u673a\u7684\u84ec\u52c3\u53d1\u5c55\uff0c\u5b57\u7b26\u96c6\u4e0e\u7f16\u7801\u6807\u51c6\u767e\u82b1\u9f50\u653e\uff0c\u800c\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u8fd9\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u4e49\u4e86\u7279\u5b9a\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u65e0\u6cd5\u5728\u591a\u8bed\u8a00\u73af\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u79cd\u8bed\u8a00\u4e5f\u5b58\u5728\u591a\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u5982\u679c\u4e24\u53f0\u7535\u8111\u5b89\u88c5\u7684\u662f\u4e0d\u540c\u7684\u7f16\u7801\u6807\u51c6\uff0c\u5219\u5728\u4fe1\u606f\u4f20\u9012\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

    \u90a3\u4e2a\u65f6\u4ee3\u7684\u4eba\u4eec\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u4e2a\u8db3\u591f\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c06\u4e16\u754c\u8303\u56f4\u5185\u7684\u6240\u6709\u8bed\u8a00\u548c\u7b26\u53f7\u90fd\u6536\u5f55\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u51b3\u8de8\u8bed\u8a00\u73af\u5883\u548c\u4e71\u7801\u95ee\u9898\u4e86\u5417\uff1f\u5728\u8fd9\u79cd\u60f3\u6cd5\u7684\u9a71\u52a8\u4e0b\uff0c\u4e00\u4e2a\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u5e94\u8fd0\u800c\u751f\u3002

    \u300cUnicode\u300d\u7684\u5168\u79f0\u4e3a\u201c\u7edf\u4e00\u5b57\u7b26\u7f16\u7801\u201d\uff0c\u7406\u8bba\u4e0a\u80fd\u5bb9\u7eb3\u4e00\u767e\u591a\u4e07\u4e2a\u5b57\u7b26\u3002\u5b83\u81f4\u529b\u4e8e\u5c06\u5168\u7403\u8303\u56f4\u5185\u7684\u5b57\u7b26\u7eb3\u5165\u5230\u7edf\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\u5b57\u7b26\u96c6\u6765\u5904\u7406\u548c\u663e\u793a\u5404\u79cd\u8bed\u8a00\u6587\u5b57\uff0c\u51cf\u5c11\u56e0\u4e3a\u7f16\u7801\u6807\u51c6\u4e0d\u540c\u800c\u4ea7\u751f\u7684\u4e71\u7801\u95ee\u9898\u3002

    \u81ea 1991 \u5e74\u53d1\u5e03\u4ee5\u6765\uff0cUnicode \u4e0d\u65ad\u6269\u5145\u65b0\u7684\u8bed\u8a00\u4e0e\u5b57\u7b26\u3002\u622a\u6b62 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7ecf\u5305\u542b 149186 \u4e2a\u5b57\u7b26\uff0c\u5305\u62ec\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\u3001\u7b26\u53f7\u3001\u751a\u81f3\u662f\u8868\u60c5\u7b26\u53f7\u7b49\u3002\u5728\u5e9e\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u7b26\u5360 3 \u5b57\u8282\u751a\u81f3 4 \u5b57\u8282\u3002

    Unicode \u662f\u4e00\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u672c\u8d28\u4e0a\u662f\u7ed9\u6bcf\u4e2a\u5b57\u7b26\u5206\u914d\u4e00\u4e2a\u7f16\u53f7\uff08\u79f0\u4e3a\u201c\u7801\u70b9\u201d\uff09\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u89c4\u5b9a\u5728\u8ba1\u7b97\u673a\u4e2d\u5982\u4f55\u5b58\u50a8\u8fd9\u4e9b\u5b57\u7b26\u7801\u70b9\u3002\u6211\u4eec\u4e0d\u7981\u4f1a\u95ee\uff1a\u5f53\u591a\u79cd\u957f\u5ea6\u7684 Unicode \u7801\u70b9\u540c\u65f6\u51fa\u73b0\u5728\u540c\u4e00\u4e2a\u6587\u672c\u4e2d\u65f6\uff0c\u7cfb\u7edf\u5982\u4f55\u89e3\u6790\u5b57\u7b26\uff1f\u4f8b\u5982\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u7684\u7f16\u7801\uff0c\u7cfb\u7edf\u5982\u4f55\u786e\u8ba4\u5b83\u662f\u4e00\u4e2a 2 \u5b57\u8282\u7684\u5b57\u7b26\u8fd8\u662f\u4e24\u4e2a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff1f

    \u5bf9\u4e8e\u4ee5\u4e0a\u95ee\u9898\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u6240\u6709\u5b57\u7b26\u5b58\u50a8\u4e3a\u7b49\u957f\u7684\u7f16\u7801\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff0c\u201c\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9ad8\u4f4d\u586b 0 \uff0c\u5c06\u201cHello \u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u90fd\u7f16\u7801\u4e3a 2 \u5b57\u8282\u957f\u5ea6\u3002\u8fd9\u6837\u7cfb\u7edf\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u5b57\u8282\u89e3\u6790\u4e00\u4e2a\u5b57\u7b26\uff0c\u6062\u590d\u51fa\u8fd9\u4e2a\u77ed\u8bed\u7684\u5185\u5bb9\u4e86\u3002

    Fig. Unicode \u7f16\u7801\u793a\u4f8b

    \u7136\u800c\uff0cASCII \u7801\u5df2\u7ecf\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u7f16\u7801\u82f1\u6587\u53ea\u9700\u8981 1 \u5b57\u8282\u3002\u82e5\u91c7\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u672c\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f\u5c06\u4f1a\u662f ASCII \u7f16\u7801\u4e0b\u5927\u5c0f\u7684 2 \u500d\uff0c\u975e\u5e38\u6d6a\u8d39\u5185\u5b58\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002

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

    \u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u4e3a\u56fd\u9645\u4e0a\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u79cd\u53ef\u53d8\u957f\u7684\u7f16\u7801\uff0c\u4f7f\u7528 1 \u5230 4 \u4e2a\u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6839\u636e\u5b57\u7b26\u7684\u590d\u6742\u6027\u800c\u53d8\u3002ASCII \u5b57\u7b26\u53ea\u9700\u8981 1 \u4e2a\u5b57\u8282\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u814a\u5b57\u6bcd\u9700\u8981 2 \u4e2a\u5b57\u8282\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u9700\u8981 3 \u4e2a\u5b57\u8282\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u7b26\u9700\u8981 4 \u4e2a\u5b57\u8282\u3002

    UTF-8 \u7684\u7f16\u7801\u89c4\u5219\u5e76\u4e0d\u590d\u6742\uff0c\u5206\u4e3a\u4e24\u79cd\u60c5\u51b5\uff1a

    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff0c\u5c06\u6700\u9ad8\u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \u3001\u5176\u4f59 7 \u4f4d\u8bbe\u7f6e\u4e3a Unicode \u7801\u70b9\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u7b26\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u5360\u636e\u4e86\u524d 128 \u4e2a\u7801\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cUTF-8 \u7f16\u7801\u53ef\u4ee5\u5411\u4e0b\u517c\u5bb9 ASCII \u7801\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u6765\u89e3\u6790\u5e74\u4ee3\u4e45\u8fdc\u7684 ASCII \u7801\u6587\u672c\u3002
    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a \\(n\\) \u5b57\u8282\u7684\u5b57\u7b26\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c06\u9996\u4e2a\u5b57\u8282\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \u3001\u7b2c \\(n + 1\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff1b\u4ece\u7b2c\u4e8c\u4e2a\u5b57\u8282\u5f00\u59cb\uff0c\u5c06\u6bcf\u4e2a\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \uff1b\u5176\u4f59\u6240\u6709\u4f4d\u7528\u4e8e\u586b\u5145\u5b57\u7b26\u7684 Unicode \u7801\u70b9\u3002

    \u4e0b\u56fe\u5c55\u793a\u4e86\u201cHello\u7b97\u6cd5\u201d\u5bf9\u5e94\u7684 UTF-8 \u7f16\u7801\u3002\u5c06\u6700\u9ad8 \\(n\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(1\\) \u6bd4\u8f83\u5bb9\u6613\u7406\u89e3\uff0c\u53ef\u4ee5\u5411\u7cfb\u7edf\u6307\u51fa\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(n\\) \u3002\u90a3\u4e48\uff0c\u4e3a\u4ec0\u4e48\u8981\u5c06\u5176\u4f59\u6240\u6709\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a \\(10\\) \u80fd\u591f\u8d77\u5230\u6821\u9a8c\u7b26\u7684\u4f5c\u7528\uff0c\u56e0\u4e3a\u5728 UTF-8 \u7f16\u7801\u89c4\u5219\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \u3002\u8fd9\u662f\u56e0\u4e3a\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\u7684\u6700\u9ad8\u4e00\u4f4d\u662f \\(0\\) \u3002\u5047\u8bbe\u7cfb\u7edf\u4ece\u4e00\u4e2a\u9519\u8bef\u7684\u5b57\u8282\u5f00\u59cb\u89e3\u6790\u6587\u672c\uff0c\u5b57\u8282\u5934\u90e8\u7684 \\(10\\) \u80fd\u591f\u5e2e\u52a9\u7cfb\u7edf\u5feb\u901f\u7684\u5224\u65ad\u51fa\u5f02\u5e38\u3002

    Fig. UTF-8 \u7f16\u7801\u793a\u4f8b

    \u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u89c1\u7684\u7f16\u7801\u65b9\u5f0f\u8fd8\u5305\u62ec UTF-16 \u548c UTF-32 \u3002\u5b83\u4eec\u4e3a Unicode \u5b57\u7b26\u96c6\u63d0\u4f9b\u4e86\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6cd5\u3002

    • UTF-16 \u7f16\u7801\uff1a\u4f7f\u7528 2 \u6216 4 \u4e2a\u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\u3002\u6240\u6709\u7684 ASCII \u5b57\u7b26\u548c\u5f88\u591a\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u7b26\uff0c\u90fd\u7528 2 \u4e2a\u5b57\u8282\u8868\u793a\uff1b\u5c11\u6570\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u4e2a\u5b57\u8282\u8868\u793a\u3002\u5bf9\u4e8e 2 \u5b57\u8282\u7684\u5b57\u7b26\uff0cUTF-16 \u7f16\u7801\u4e0e Unicode \u7801\u70b9\u76f8\u7b49\u3002
    • UTF-32 \u7f16\u7801\uff1a\u6bcf\u4e2a\u5b57\u7b26\u90fd\u4f7f\u7528 4 \u4e2a\u5b57\u8282\u3002\u8fd9\u610f\u5473\u7740 UTF-32 \u4f1a\u6bd4 UTF-8 \u548c UTF-16 \u66f4\u5360\u7528\u7a7a\u95f4\uff0c\u7279\u522b\u662f\u5bf9\u4e8e\u4e3b\u8981\u4f7f\u7528 ASCII \u5b57\u7b26\u7684\u6587\u672c\u3002

    \u4ece\u5b58\u50a8\u7a7a\u95f4\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u7b26\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 1 \u4e2a\u5b57\u8282\uff1b\u4f7f\u7528 UTF-16 \u7f16\u7801\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u7b26\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u4f1a\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u53ea\u9700\u8981 2 \u4e2a\u5b57\u8282\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u4e2a\u5b57\u8282\u3002\u4ece\u517c\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8bb8\u591a\u5de5\u5177\u548c\u5e93\u90fd\u4f18\u5148\u652f\u6301 UTF-8 \u3002

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5. \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801","text":"

    \u5bf9\u4e8e\u4ee5\u5f80\u7684\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff0c\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u7684\u5b57\u7b26\u4e32\u90fd\u91c7\u7528 UTF-16 \u6216 UTF-32 \u8fd9\u7c7b\u7b49\u957f\u7684\u7f16\u7801\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u7b49\u957f\u7f16\u7801\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u7b26\u4e32\u770b\u4f5c\u6570\u7ec4\u6765\u5904\u7406\uff0c\u5177\u4f53\u6765\u8bf4\uff1a

    • \u968f\u673a\u8bbf\u95ee: UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u8fdb\u884c\u968f\u673a\u8bbf\u95ee\u3002UTF-8 \u662f\u4e00\u79cd\u53d8\u957f\u7f16\u7801\uff0c\u8981\u627e\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u4ece\u5b57\u7b26\u4e32\u7684\u5f00\u59cb\u5904\u904d\u5386\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u8fd9\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u3002
    • \u5b57\u7b26\u8ba1\u6570: \u4e0e\u968f\u673a\u8bbf\u95ee\u7c7b\u4f3c\uff0c\u8ba1\u7b97 UTF-16 \u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8ba1\u7b97 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u9700\u8981\u904d\u5386\u6574\u4e2a\u5b57\u7b26\u4e32\u3002
    • \u5b57\u7b26\u4e32\u64cd\u4f5c: \u5728 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u5f88\u591a\u5b57\u7b26\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u8fde\u63a5\u3001\u63d2\u5165\u3001\u5220\u9664\u7b49\uff09\u90fd\u66f4\u5bb9\u6613\u8fdb\u884c\u3002\u5728 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\u8fdb\u884c\u8fd9\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u989d\u5916\u7684\u8ba1\u7b97\uff0c\u4ee5\u786e\u4fdd\u4e0d\u4f1a\u4ea7\u751f\u65e0\u6548\u7684 UTF-8 \u7f16\u7801\u3002

    \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6848\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5f88\u6709\u8da3\u7684\u8bdd\u9898\uff0c\u6d89\u53ca\u5230\u8bb8\u591a\u56e0\u7d20\uff1a

    • Java \u7684 String \u7c7b\u578b\u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a Java \u8bed\u8a00\u8bbe\u8ba1\u4e4b\u521d\uff0c\u4eba\u4eec\u8ba4\u4e3a 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u7b26\u3002\u7136\u800c\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u6b63\u786e\u7684\u5224\u65ad\u3002\u540e\u6765 Unicode \u89c4\u8303\u6269\u5c55\u5230\u4e86\u8d85\u8fc7 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u7b26\u73b0\u5728\u53ef\u80fd\u7531\u4e00\u5bf9 16 \u4f4d\u7684\u503c\uff08\u79f0\u4e3a\u201c\u4ee3\u7406\u5bf9\u201d\uff09\u8868\u793a\u3002
    • JavaScript \u548c TypeScript \u7684\u5b57\u7b26\u4e32\u4f7f\u7528 UTF-16 \u7f16\u7801\u7684\u539f\u56e0\u4e0e Java \u7c7b\u4f3c\u3002\u5f53 JavaScript \u8bed\u8a00\u5728 1995 \u5e74\u88ab Netscape \u516c\u53f8\u9996\u6b21\u5f15\u5165\u65f6\uff0cUnicode \u8fd8\u5904\u4e8e\u76f8\u5bf9\u65e9\u671f\u7684\u9636\u6bb5\uff0c\u90a3\u65f6\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7f16\u7801\u5c31\u8db3\u591f\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u7b26\u4e86\u3002
    • C# \u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u4e3b\u8981\u56e0\u4e3a .NET \u5e73\u53f0\u662f\u7531 Microsoft \u8bbe\u8ba1\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u672f\uff0c\u5305\u62ec Windows \u64cd\u4f5c\u7cfb\u7edf\uff0c\u90fd\u5e7f\u6cdb\u5730\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002

    \u7531\u4e8e\u4ee5\u4e0a\u7f16\u7a0b\u8bed\u8a00\u5bf9\u5b57\u7b26\u6570\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u4eec\u4e0d\u5f97\u4e0d\u91c7\u53d6\u201c\u4ee3\u7406\u5bf9\u201d\u7684\u65b9\u5f0f\u6765\u8868\u793a\u8d85\u8fc7 16 \u4f4d\u957f\u5ea6\u7684 Unicode \u5b57\u7b26\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u5f97\u5df2\u4e3a\u4e4b\u7684\u65e0\u5948\u4e4b\u4e3e\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5bf9\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e00\u4e2a\u5b57\u7b26\u53ef\u80fd\u5360\u7528 2 \u5b57\u8282\u6216 4 \u5b57\u8282\uff0c\u56e0\u6b64\u4e27\u5931\u4e86\u7b49\u957f\u7f16\u7801\u7684\u4f18\u52bf\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5904\u7406\u4ee3\u7406\u5bf9\u9700\u8981\u589e\u52a0\u989d\u5916\u4ee3\u7801\uff0c\u8fd9\u589e\u52a0\u4e86\u7f16\u7a0b\u7684\u590d\u6742\u6027\u548c Debug \u96be\u5ea6\u3002

    \u51fa\u4e8e\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u63d0\u51fa\u4e86\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6848\uff1a

    • Python 3 \u4f7f\u7528\u4e00\u79cd\u7075\u6d3b\u7684\u5b57\u7b26\u4e32\u8868\u793a\uff0c\u5b58\u50a8\u7684\u5b57\u7b26\u957f\u5ea6\u53d6\u51b3\u4e8e\u5b57\u7b26\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u7801\u70b9\u3002\u5bf9\u4e8e\u5168\u90e8\u662f ASCII \u5b57\u7b26\u7684\u5b57\u7b26\u4e32\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u4e2a\u5b57\u8282\uff1b\u5982\u679c\u5b57\u7b26\u4e32\u4e2d\u5305\u542b\u7684\u5b57\u7b26\u8d85\u51fa\u4e86 ASCII \u8303\u56f4\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8bed\u8a00\u5e73\u9762\uff08BMP\uff09\u5185\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u4e2a\u5b57\u8282\uff1b\u5982\u679c\u5b57\u7b26\u4e32\u4e2d\u6709\u8d85\u51fa BMP \u7684\u5b57\u7b26\uff0c\u90a3\u4e48\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 4 \u4e2a\u5b57\u8282\u3002
    • Go \u8bed\u8a00\u7684 string \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Go \u8bed\u8a00\u8fd8\u63d0\u4f9b\u4e86 rune \u7c7b\u578b\uff0c\u5b83\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002
    • Rust \u8bed\u8a00\u7684 str \u548c String \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u7c7b\u578b\uff0c\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8ba8\u8bba\u7684\u90fd\u662f\u5b57\u7b26\u4e32\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u8fd9\u548c\u5b57\u7b26\u4e32\u5982\u4f55\u5728\u6587\u4ef6\u4e2d\u5b58\u50a8\u6216\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u662f\u4e24\u4e2a\u4e0d\u540c\u7684\u95ee\u9898\u3002\u5728\u6587\u4ef6\u5b58\u50a8\u6216\u7f51\u7edc\u4f20\u8f93\u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u4f1a\u5c06\u5b57\u7b26\u4e32\u7f16\u7801\u4e3a UTF-8 \u683c\u5f0f\uff0c\u4ee5\u8fbe\u5230\u6700\u4f18\u7684\u517c\u5bb9\u6027\u548c\u7a7a\u95f4\u6548\u7387\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1. \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

    \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/#311","title":"3.1.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/#312","title":"3.1.2. \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u79bb\u6563","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

    \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\u56e0\u6b64\uff0c\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\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

    \u300c\u7269\u7406\u7ed3\u6784\u300d\u53cd\u6620\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\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

    \u5982\u82e5\u611f\u89c9\u7406\u89e3\u7269\u7406\u7ed3\u6784\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\u6570\u7ec4\u4e0e\u94fe\u8868\u662f\u5176\u4ed6\u6240\u6709\u6570\u636e\u7ed3\u6784\u7684\u57fa\u77f3\uff0c\u5efa\u8bae\u4f60\u6295\u5165\u66f4\u591a\u65f6\u95f4\u6df1\u5165\u4e86\u89e3\u8fd9\u4e24\u79cd\u57fa\u672c\u6570\u636e\u7ed3\u6784\u3002

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3. \u00a0 \u6570\u5b57\u7f16\u7801 *","text":"

    Note

    \u5728\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u5e26\u6709\u7684 * \u7b26\u53f7\u7684\u662f\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u65f6\u95f4\u6709\u9650\u6216\u611f\u5230\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

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1. \u00a0 \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801","text":"

    \u4ece\u4e0a\u4e00\u8282\u7684\u8868\u683c\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6240\u6709\u6574\u6570\u7c7b\u578b\u80fd\u591f\u8868\u793a\u7684\u8d1f\u6570\u90fd\u6bd4\u6b63\u6570\u591a\u4e00\u4e2a\u3002\u4f8b\u5982\uff0cbyte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \u3002\u8fd9\u4e2a\u73b0\u8c61\u6bd4\u8f83\u53cd\u76f4\u89c9\uff0c\u5b83\u7684\u5185\u5728\u539f\u56e0\u6d89\u53ca\u5230\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u76f8\u5173\u77e5\u8bc6\u3002\u5728\u5c55\u5f00\u5206\u6790\u4e4b\u524d\uff0c\u6211\u4eec\u9996\u5148\u7ed9\u51fa\u4e09\u8005\u7684\u5b9a\u4e49\uff1a

    • \u539f\u7801\uff1a\u6211\u4eec\u5c06\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6570\uff0c\\(1\\) \u8868\u793a\u8d1f\u6570\uff0c\u5176\u4f59\u4f4d\u8868\u793a\u6570\u5b57\u7684\u503c\u3002
    • \u53cd\u7801\uff1a\u6b63\u6570\u7684\u53cd\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u53cd\u7801\u662f\u5bf9\u5176\u539f\u7801\u9664\u7b26\u53f7\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
    • \u8865\u7801\uff1a\u6b63\u6570\u7684\u8865\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u8865\u7801\u662f\u5728\u5176\u53cd\u7801\u7684\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u3002

    Fig. \u539f\u7801\u3001\u53cd\u7801\u4e0e\u8865\u7801\u4e4b\u95f4\u7684\u76f8\u4e92\u8f6c\u6362

    \u663e\u7136\uff0c\u300c\u539f\u7801\u300d\u6700\u4e3a\u76f4\u89c2\uff0c\u7136\u800c\u6570\u5b57\u5374\u662f\u4ee5\u300c\u8865\u7801\u300d\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u539f\u7801\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u8d1f\u6570\u7684\u539f\u7801\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8e\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u5728\u539f\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7ed3\u679c\u662f \\(-3\\) \uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002

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

    \u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8ba1\u7b97\u673a\u5f15\u5165\u4e86\u300c\u53cd\u7801\u300d\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u5148\u5c06\u539f\u7801\u8f6c\u6362\u4e3a\u53cd\u7801\uff0c\u5e76\u5728\u53cd\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5e76\u5c06\u7ed3\u679c\u4ece\u53cd\u7801\u8f6c\u5316\u56de\u539f\u7801\uff0c\u5219\u53ef\u5f97\u5230\u6b63\u786e\u7ed3\u679c \\(-1\\) \u3002

    \\[ \\begin{aligned} & 1 + (-2) \\newline & = 0000 \\space 0001 \\space \\text{(\u539f\u7801)} + 1000 \\space 0010 \\space \\text{(\u539f\u7801)} \\newline & = 0000 \\space 0001 \\space \\text{(\u53cd\u7801)} + 1111 \\space 1101 \\space \\text{(\u53cd\u7801)} \\newline & = 1111 \\space 1110 \\space \\text{(\u53cd\u7801)} \\newline & = 1000 \\space 0001 \\space \\text{(\u539f\u7801)} \\newline & = -1 \\end{aligned} \\]

    \u53e6\u4e00\u65b9\u9762\uff0c\u6570\u5b57\u96f6\u7684\u539f\u7801\u6709 \\(+0\\) \u548c \\(-0\\) \u4e24\u79cd\u8868\u793a\u65b9\u5f0f\u3002\u8fd9\u610f\u5473\u7740\u6570\u5b57\u96f6\u5bf9\u5e94\u7740\u4e24\u4e2a\u4e0d\u540c\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\uff0c\u800c\u8fd9\u53ef\u80fd\u4f1a\u5e26\u6765\u6b67\u4e49\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u5728\u6761\u4ef6\u5224\u65ad\u4e2d\uff0c\u5982\u679c\u6ca1\u6709\u533a\u5206\u6b63\u96f6\u548c\u8d1f\u96f6\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u9519\u8bef\u7684\u5224\u65ad\u7ed3\u679c\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\u5904\u7406\u6b63\u96f6\u548c\u8d1f\u96f6\u6b67\u4e49\uff0c\u5219\u9700\u8981\u5f15\u5165\u989d\u5916\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u5176\u53ef\u80fd\u4f1a\u964d\u4f4e\u8ba1\u7b97\u673a\u7684\u8fd0\u7b97\u6548\u7387\u3002

    \\[ \\begin{aligned} +0 & = 0000 \\space 0000 \\newline -0 & = 1000 \\space 0000 \\end{aligned} \\]

    \u4e0e\u539f\u7801\u4e00\u6837\uff0c\u53cd\u7801\u4e5f\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\u3002\u4e3a\u6b64\uff0c\u8ba1\u7b97\u673a\u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u300c\u8865\u7801\u300d\u3002\u90a3\u4e48\uff0c\u8865\u7801\u6709\u4ec0\u4e48\u4f5c\u7528\u5462\uff1f\u6211\u4eec\u5148\u6765\u5206\u6790\u4e00\u4e0b\u8d1f\u96f6\u7684\u8865\u7801\u7684\u8ba1\u7b97\u8fc7\u7a0b\uff1a

    \\[ \\begin{aligned} -0 = \\space & 1000 \\space 0000 \\space \\text{(\u539f\u7801)} \\newline = \\space & 1111 \\space 1111 \\space \\text{(\u53cd\u7801)} \\newline = 1 \\space & 0000 \\space 0000 \\space \\text{(\u8865\u7801)} \\newline \\end{aligned} \\]

    \u5728\u8d1f\u96f6\u7684\u53cd\u7801\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u4f1a\u4ea7\u751f\u8fdb\u4f4d\uff0c\u800c\u7531\u4e8e byte \u7684\u957f\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u51fa\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u4f1a\u88ab\u820d\u5f03\u3002\u4ece\u800c\u5f97\u5230\u8d1f\u96f6\u7684\u8865\u7801\u4e3a \\(0000 \\space 0000\\) \uff0c\u4e0e\u6b63\u96f6\u7684\u8865\u7801\u76f8\u540c\u3002\u8fd9\u610f\u5473\u7740\u5728\u8865\u7801\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u4e2a\u96f6\uff0c\u4ece\u800c\u89e3\u51b3\u4e86\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\u3002

    \u8fd8\u5269\u4f59\u6700\u540e\u4e00\u4e2a\u7591\u60d1\uff1abyte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u8d1f\u6570 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u4eec\u6ce8\u610f\u5230\uff0c\u533a\u95f4 \\([-127, +127]\\) \u5185\u7684\u6240\u6709\u6574\u6570\u90fd\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\uff0c\u5e76\u4e14\u539f\u7801\u548c\u8865\u7801\u4e4b\u95f4\u662f\u53ef\u4ee5\u4e92\u76f8\u8f6c\u6362\u7684\u3002

    \u7136\u800c\uff0c\u8865\u7801 \\(1000 \\space 0000\\) \u662f\u4e00\u4e2a\u4f8b\u5916\uff0c\u5b83\u5e76\u6ca1\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3002\u6839\u636e\u8f6c\u6362\u65b9\u6cd5\uff0c\u6211\u4eec\u5f97\u5230\u8be5\u8865\u7801\u7684\u539f\u7801\u4e3a \\(0000 \\space 0000\\) \u3002\u8fd9\u663e\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u4e3a\u8be5\u539f\u7801\u8868\u793a\u6570\u5b57 \\(0\\) \uff0c\u5b83\u7684\u8865\u7801\u5e94\u8be5\u662f\u81ea\u8eab\u3002\u8ba1\u7b97\u673a\u89c4\u5b9a\u8fd9\u4e2a\u7279\u6b8a\u7684\u8865\u7801 \\(1000 \\space 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5b9e\u9645\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u8865\u7801\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u5c31\u662f \\(-128\\) \u3002

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & = 1111 \\space 1111 \\space \\text{(\u539f\u7801)} + 1000 \\space 0001 \\space \\text{(\u539f\u7801)} \\newline & = 1000 \\space 0000 \\space \\text{(\u53cd\u7801)} + 1111 \\space 1110 \\space \\text{(\u53cd\u7801)} \\newline & = 1000 \\space 0001 \\space \\text{(\u8865\u7801)} + 1111 \\space 1111 \\space \\text{(\u8865\u7801)} \\newline & = 1000 \\space 0000 \\space \\text{(\u8865\u7801)} \\newline & = -128 \\end{aligned} \\]

    \u4f60\u53ef\u80fd\u5df2\u7ecf\u53d1\u73b0\uff0c\u4e0a\u8ff0\u7684\u6240\u6709\u8ba1\u7b97\u90fd\u662f\u52a0\u6cd5\u8fd0\u7b97\u3002\u8fd9\u6697\u793a\u7740\u4e00\u4e2a\u91cd\u8981\u4e8b\u5b9e\uff1a\u8ba1\u7b97\u673a\u5185\u90e8\u7684\u786c\u4ef6\u7535\u8def\u4e3b\u8981\u662f\u57fa\u4e8e\u52a0\u6cd5\u8fd0\u7b97\u8bbe\u8ba1\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u52a0\u6cd5\u8fd0\u7b97\u76f8\u5bf9\u4e8e\u5176\u4ed6\u8fd0\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u51cf\u6cd5\uff09\u6765\u8bf4\uff0c\u786c\u4ef6\u5b9e\u73b0\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u66f4\u5bb9\u6613\u8fdb\u884c\u5e76\u884c\u5316\u5904\u7406\uff0c\u4ece\u800c\u63d0\u9ad8\u8fd0\u7b97\u901f\u5ea6\u3002

    \u7136\u800c\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8ba1\u7b97\u673a\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u901a\u8fc7\u5c06\u52a0\u6cd5\u4e0e\u4e00\u4e9b\u57fa\u672c\u903b\u8f91\u8fd0\u7b97\u7ed3\u5408\uff0c\u8ba1\u7b97\u673a\u80fd\u591f\u5b9e\u73b0\u5404\u79cd\u5176\u4ed6\u7684\u6570\u5b66\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u8ba1\u7b97\u51cf\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8ba1\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u51cf\u6cd5\u3002

    \u73b0\u5728\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u8ba1\u7b97\u673a\u4f7f\u7528\u8865\u7801\u7684\u539f\u56e0\uff1a\u57fa\u4e8e\u8865\u7801\u8868\u793a\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u7535\u8def\u548c\u64cd\u4f5c\u6765\u5904\u7406\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\u6765\u5904\u7406\u51cf\u6cd5\uff0c\u5e76\u4e14\u65e0\u9700\u7279\u522b\u5904\u7406\u6b63\u8d1f\u96f6\u7684\u6b67\u4e49\u95ee\u9898\u3002\u8fd9\u5927\u5927\u7b80\u5316\u4e86\u786c\u4ef6\u8bbe\u8ba1\uff0c\u5e76\u63d0\u9ad8\u4e86\u8fd0\u7b97\u6548\u7387\u3002

    \u8865\u7801\u7684\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\uff0c\u7531\u4e8e\u7bc7\u5e45\u5173\u7cfb\u6211\u4eec\u5148\u4ecb\u7ecd\u5230\u8fd9\u91cc\u3002\u5efa\u8bae\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8fdb\u4e00\u6b65\u6df1\u5ea6\u4e86\u89e3\u3002

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2. \u00a0 \u6d6e\u70b9\u6570\u7f16\u7801","text":"

    \u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 bytes\uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\u8fd9\u975e\u5e38\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u6309\u7406\u8bf4 float \u9700\u8981\u8868\u793a\u5c0f\u6570\uff0c\u53d6\u503c\u8303\u56f4\u5e94\u8be5\u53d8\u5c0f\u624d\u5bf9\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u56e0\u4e3a\u6d6e\u70b9\u6570 float \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\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/summary/","title":"3.5. \u00a0 \u5c0f\u7ed3","text":"

    \u6570\u636e\u7ed3\u6784\u5206\u7c7b

    • \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
    • \u5f53\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u88ab\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u3002\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u62e5\u6709\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\uff0c\u7a0b\u5e8f\u901a\u8fc7\u8fd9\u4e9b\u5185\u5b58\u5730\u5740\u8bbf\u95ee\u6570\u636e\u3002
    • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\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

    \u6570\u636e\u7c7b\u578b\u4e0e\u7f16\u7801

    • \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 \u3002\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
    • \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7f16\u7801\u6570\u5b57\u7684\u4e09\u79cd\u65b9\u6cd5\uff0c\u5b83\u4eec\u4e4b\u95f4\u662f\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\u7684\u3002\u6574\u6570\u7684\u539f\u7801\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u53f7\u4f4d\uff0c\u5176\u4f59\u4f4d\u662f\u6570\u5b57\u7684\u503c\u3002
    • \u6574\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u662f\u4ee5\u8865\u7801\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\u3002\u5728\u8865\u7801\u8868\u793a\u4e0b\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u5bf9\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\u4e00\u89c6\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u4e3a\u51cf\u6cd5\u64cd\u4f5c\u5355\u72ec\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\uff0c\u5e76\u4e14\u4e0d\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u7684\u95ee\u9898\u3002
    • \u6d6e\u70b9\u6570\u7684\u7f16\u7801\u7531 1 \u4f4d\u7b26\u53f7\u4f4d\u30018 \u4f4d\u6307\u6570\u4f4d\u548c 23 \u4f4d\u5206\u6570\u4f4d\u6784\u6210\u3002\u7531\u4e8e\u5b58\u5728\u6307\u6570\u4f4d\uff0c\u6d6e\u70b9\u6570\u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e\u6574\u6570\uff0c\u4ee3\u4ef7\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002
    • ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u957f\u5ea6\u4e3a 1 \u5b57\u8282\uff0c\u5171\u6536\u5f55 127 \u4e2a\u5b57\u7b26\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u5f55\u4e24\u4e07\u591a\u4e2a\u6c49\u5b57\u3002Unicode \u81f4\u529b\u4e8e\u63d0\u4f9b\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u6536\u5f55\u4e16\u754c\u5185\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u4ece\u800c\u89e3\u51b3\u7531\u4e8e\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5bfc\u81f4\u7684\u4e71\u7801\u95ee\u9898\u3002
    • UTF-8 \u662f\u6700\u53d7\u6b22\u8fce\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u79cd\u53d8\u957f\u7684\u7f16\u7801\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u6269\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5b58\u50a8\u7a7a\u95f4\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u957f\u7684\u7f16\u7801\u65b9\u6cd5\u3002\u5728\u7f16\u7801\u4e2d\u6587\u65f6\uff0cUTF-16 \u6bd4 UTF-8 \u7684\u5360\u7528\u7a7a\u95f4\u66f4\u5c0f\u3002Java, C# \u7b49\u7f16\u7a0b\u8bed\u8a00\u9ed8\u8ba4\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002
    "},{"location":"chapter_data_structure/summary/#351-q-a","title":"3.5.1. \u00a0 Q & A","text":"

    \u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1f

    \u54c8\u5e0c\u8868\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u800c\u4e3a\u4e86\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u4f7f\u7528\u201c\u62c9\u94fe\u6cd5\u201d\uff08\u540e\u7eed\u6563\u5217\u8868\u7ae0\u8282\u4f1a\u8bb2\uff09\u3002\u5728\u62c9\u94fe\u6cd5\u4e2d\uff0c\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5730\u5740\uff08\u6876\uff09\u6307\u5411\u4e00\u4e2a\u94fe\u8868\uff1b\u5f53\u8fd9\u4e2a\u94fe\u8868\u957f\u5ea6\u8d85\u8fc7\u4e00\u5b9a\u9608\u503c\u65f6\uff0c\u53c8\u53ef\u80fd\u88ab\u8f6c\u5316\u4e3a\u6811\uff08\u901a\u5e38\u4e3a\u7ea2\u9ed1\u6811\uff09\u3002\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\uff08\u6570\u7ec4\u3001\u94fe\u8868\uff09\u548c\u975e\u7ebf\u6027\uff08\u6811\uff09\u6570\u636e\u7ed3\u6784\u3002

    char \u7c7b\u578b\u7684\u957f\u5ea6\u662f 1 bytes \u5417\uff1f

    \u8fd9\u4e2a\u4e0e\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u7f16\u7801\u65b9\u6cd5\u6709\u5173\u3002\u4f8b\u5982\uff0cJava, JS, TS, C# \u90fd\u91c7\u7528 UTF-16 \u7f16\u7801\uff08\u4fdd\u5b58 Unicode \u7801\u70b9\uff09\uff0c\u56e0\u6b64 char \u7c7b\u578b\u7684\u957f\u5ea6\u4e3a 2 bytes \u3002

    "},{"location":"chapter_graph/graph/","title":"9.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/#911","title":"9.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/#912","title":"9.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/#913","title":"9.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/#914","title":"9.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":"9.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/#921","title":"9.2.1. \u00a0 \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u7684\u5b9e\u73b0","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \u7684\u65e0\u5411\u56fe\uff0c\u5219\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 {\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) {\nthis.vertices = new List<int>();\nthis.adjMat = new List<List<int>>();\n// \u6dfb\u52a0\u9876\u70b9\nforeach (int val in 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\nforeach (int[] e in edges) {\naddEdge(e[0], e[1]);\n}\n}\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\npublic int size() {\nreturn vertices.Count;\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<int> newRow = new List<int>(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\nforeach (List<int> row in adjMat) {\nrow.Add(0);\n}\n}\n/* \u5220\u9664\u9876\u70b9 */\npublic void removeVertex(int index) {\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) {\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// \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// \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() {\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/#922","title":"9.2.2. \u00a0 \u57fa\u4e8e\u90bb\u63a5\u8868\u7684\u5b9e\u73b0","text":"

    \u8bbe\u65e0\u5411\u56fe\u7684\u9876\u70b9\u603b\u6570\u4e3a \\(n\\) \u3001\u8fb9\u603b\u6570\u4e3a \\(m\\) \uff0c\u5219\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(n + m)\\) \u65f6\u95f4\u3002
    • \u521d\u59cb\u5316\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u521b\u5efa \\(n\\) \u4e2a\u9876\u70b9\u548c \\(2m\\) \u6761\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
    \u521d\u59cb\u5316\u90bb\u63a5\u8868\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

    \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// \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) {\nthis.adjList = new Dictionary<Vertex, List<Vertex>>();\n// \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\nforeach (Vertex[] edge in 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.Count;\n}\n/* \u6dfb\u52a0\u8fb9 */\npublic void addEdge(Vertex vet1, Vertex vet2) {\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) {\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) {\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) {\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) {\nlist.Remove(vet);\n}\n}\n/* \u6253\u5370\u90bb\u63a5\u8868 */\npublic void print() {\nConsole.WriteLine(\"\u90bb\u63a5\u8868 =\");\nforeach (KeyValuePair<Vertex, List<Vertex>> entry in adjList) {\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/#923","title":"9.2.3. \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

    \u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\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":"9.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/#931","title":"9.3.1. \u00a0 \u5e7f\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u4ece\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// \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) {\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]) {\nif (visited.Contains(adjVet)) {\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/#932","title":"9.3.2. \u00a0 \u6df1\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u518d\u56de\u5934\u7684\u904d\u5386\u65b9\u5f0f\u3002\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) {\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]) {\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, 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 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":"9.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_graph/summary/#941-q-a","title":"9.4.1. \u00a0 Q & A","text":"

    \u8def\u5f84\u7684\u5b9a\u4e49\u662f\u9876\u70b9\u5e8f\u5217\u8fd8\u662f\u8fb9\u5e8f\u5217\uff1f

    \u7ef4\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8bed\u8a00\u7248\u672c\u7684\u5b9a\u4e49\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices. \u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f84\u88ab\u8ba4\u4e3a\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u3002\u8fd9\u662f\u56e0\u4e3a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u53ef\u80fd\u5b58\u5728\u591a\u6761\u8fb9\u8fde\u63a5\uff0c\u6b64\u65f6\u6bcf\u6761\u8fb9\u90fd\u5bf9\u5e94\u4e00\u6761\u8def\u5f84\u3002

    \u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u662f\u5426\u4f1a\u6709\u65e0\u6cd5\u904d\u5386\u5230\u7684\u70b9\uff1f

    \u5728\u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002\u904d\u5386\u975e\u8fde\u901a\u56fe\u9700\u8981\u8bbe\u7f6e\u591a\u4e2a\u8d77\u70b9\uff0c\u4ee5\u904d\u5386\u5230\u56fe\u7684\u6240\u6709\u8fde\u901a\u5206\u91cf\u3002

    \u5728\u90bb\u63a5\u8868\u4e2d\uff0c\u201c\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u6240\u6709\u9876\u70b9\u201d\u7684\u9876\u70b9\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

    \u53ef\u4ee5\u662f\u4efb\u610f\u987a\u5e8f\u3002\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u53ef\u80fd\u4f1a\u9700\u8981\u6309\u7167\u6307\u5b9a\u89c4\u5219\u6765\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9876\u70b9\u6dfb\u52a0\u7684\u6b21\u5e8f\u3001\u6216\u8005\u6309\u7167\u9876\u70b9\u503c\u5927\u5c0f\u7684\u987a\u5e8f\u7b49\u7b49\uff0c\u8fd9\u6837\u53ef\u4ee5\u6709\u52a9\u4e8e\u5feb\u901f\u67e5\u627e\u201c\u5e26\u6709\u67d0\u79cd\u6781\u503c\u201d\u7684\u9876\u70b9\u3002

    "},{"location":"chapter_hashing/hash_collision/","title":"6.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/#621","title":"6.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/#622","title":"6.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/#623","title":"6.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\u5f0f\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\u8fbe\u5230 64 \u4e14\u94fe\u8868\u957f\u5ea6\u8fbe\u5230 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u88ab\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\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":"6.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/#611","title":"6.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/#612","title":"6.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 \\bmod {100} \\]

    \u5176\u4e2d \\(\\bmod\\) \u8868\u793a\u53d6\u4f59\u8fd0\u7b97\u3002

    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 = 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 = []\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 = []\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 {\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();\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[index];\nif (pair == null) return 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[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[index] = null;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\npublic List<Entry> entrySet() {\nList<Entry> entrySet = new();\nforeach (Entry? pair in buckets) {\nif (pair != null)\nentrySet.Add(pair);\n}\nreturn entrySet;\n}\n/* \u83b7\u53d6\u6240\u6709\u952e */\npublic List<int> keySet() {\nList<int> keySet = new();\nforeach (Entry? pair in 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();\nforeach (Entry? pair in buckets) {\nif (pair != null)\nvalueSet.Add(pair.val);\n}\nreturn valueSet;\n}\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\npublic void print() {\nforeach (Entry kv in entrySet()) {\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/#613","title":"6.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 \\bmod 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":"6.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":"8.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/#821","title":"8.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/#822","title":"8.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// \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--) {\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/#823","title":"8.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":"8.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/#811","title":"8.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/#812","title":"8.1.2. \u00a0 \u5806\u7684\u5b9e\u73b0","text":"

    \u4e0b\u6587\u5b9e\u73b0\u7684\u662f\u5927\u9876\u5806\u3002\u82e5\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u5c0f\u9876\u5806\uff0c\u53ea\u9700\u5c06\u6240\u6709\u5927\u5c0f\u903b\u8f91\u5224\u65ad\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) {\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.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() {\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><7><8><9>

    \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// \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// \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 IndexOutOfBoundsException();\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\nif self.is_empty():\nraise IndexError(\"\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\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// \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) {\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[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/#813","title":"8.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\u4e0d\u65ad\u5730\u6267\u884c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u6570\u636e\u3002\u7136\u800c\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u4f7f\u7528\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u5806\u6392\u5e8f\uff0c\u8be6\u89c1\u540e\u7eed\u7684\u5806\u6392\u5e8f\u7ae0\u8282\u3002
    • \u83b7\u53d6\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff1a\u8fd9\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u7b97\u6cd5\u95ee\u9898\uff0c\u540c\u65f6\u4e5f\u662f\u4e00\u79cd\u5178\u578b\u5e94\u7528\uff0c\u4f8b\u5982\u9009\u62e9\u70ed\u5ea6\u524d 10 \u7684\u65b0\u95fb\u4f5c\u4e3a\u5fae\u535a\u70ed\u641c\uff0c\u9009\u53d6\u9500\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
    "},{"location":"chapter_heap/summary/","title":"8.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

    Fig. \u62fc\u88c5\u79ef\u6728

    \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\u624b\u8111\u5e76\u7528\u7684\u5b66\u4e60\u65b9\u5f0f\uff0c\u5728\u8fd9\u4e00\u70b9\u4e0a\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\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 \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/#022","title":"0.2.2. \u00a0 \u5728\u52a8\u753b\u56fe\u89e3\u4e2d\u9ad8\u6548\u5b66\u4e60","text":"

    \u76f8\u8f83\u4e8e\u6587\u5b57\uff0c\u89c6\u9891\u548c\u56fe\u7247\u5177\u6709\u66f4\u9ad8\u7684\u4fe1\u606f\u5bc6\u5ea6\u548c\u7ed3\u6784\u5316\u7a0b\u5ea6\uff0c\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/#023","title":"0.2.3. \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

    \u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\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/#024","title":"0.2.4. \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/suggestions/#025","title":"0.2.5. \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf","text":"

    \u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8fc7\u7a0b\u5212\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\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/summary/","title":"0.3. \u00a0 \u5c0f\u7ed3","text":"
    • \u672c\u4e66\u7684\u4e3b\u8981\u53d7\u4f17\u662f\u7b97\u6cd5\u521d\u5b66\u8005\u3002\u5982\u679c\u5df2\u6709\u4e00\u5b9a\u57fa\u7840\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u60a8\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u4e66\u5185\u6e90\u4ee3\u7801\u4e5f\u53ef\u4f5c\u4e3a\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u4f7f\u7528\u3002
    • \u4e66\u4e2d\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u590d\u6742\u5ea6\u5206\u6790\u3001\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u5927\u90e8\u5206\u4e3b\u9898\u3002
    • \u5bf9\u4e8e\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b66\u9636\u6bb5\u9605\u8bfb\u4e00\u672c\u5165\u95e8\u4e66\u7c4d\u81f3\u5173\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8bb8\u591a\u5f2f\u8def\u3002
    • \u4e66\u5185\u7684\u52a8\u753b\u548c\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u3002\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5e94\u7ed9\u4e88\u8fd9\u4e9b\u5185\u5bb9\u66f4\u591a\u5173\u6ce8\u3002
    • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\u3002\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u6253\u4ee3\u7801\u3002
    • \u672c\u4e66\u7f51\u9875\u7248\u7684\u6bcf\u4e2a\u7ae0\u8282\u90fd\u8bbe\u6709\u8ba8\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\u4e0e\u89c1\u89e3\u3002
    "},{"location":"chapter_reference/","title":"\u53c2\u8003\u6587\u732e","text":"

    [1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

    [2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

    [3] \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/binary_search/","title":"10.1. \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

    \u300c\u4e8c\u5206\u67e5\u627e Binary Search\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u601d\u60f3\u7684\u9ad8\u6548\u641c\u7d22\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f6e\u51cf\u5c11\u4e00\u534a\u641c\u7d22\u8303\u56f4\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u4e3a\u6b62\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\uff0c\u6570\u7ec4\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u8be5\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    \u5bf9\u4e8e\u4e0a\u8ff0\u95ee\u9898\uff0c\u6211\u4eec\u5148\u521d\u59cb\u5316\u6307\u9488 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u7d22\u533a\u95f4 \\([0, n - 1]\\) \u3002\u5176\u4e2d\uff0c\u4e2d\u62ec\u53f7\u8868\u793a\u201c\u95ed\u533a\u95f4\u201d\uff0c\u5373\u5305\u542b\u8fb9\u754c\u503c\u672c\u8eab\u3002

    \u63a5\u4e0b\u6765\uff0c\u5faa\u73af\u6267\u884c\u4ee5\u4e0b\u4e24\u4e2a\u6b65\u9aa4\uff1a

    1. \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\space \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
    2. \u5224\u65ad nums[m] \u548c target \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4e09\u79cd\u60c5\u51b5\uff1a
      1. \u5f53 nums[m] < target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(i = m + 1\\) \uff1b
      2. \u5f53 nums[m] > target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(j = m - 1\\) \uff1b
      3. \u5f53 nums[m] = target \u65f6\uff0c\u8bf4\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \uff1b

    \u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20\uff0c\u641c\u7d22\u533a\u95f4\u6700\u7ec8\u4f1a\u7f29\u5c0f\u4e3a\u7a7a\u3002\u6b64\u65f6\u8fd4\u56de \\(-1\\) \u3002

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

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u7c7b\u578b\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u4e3a\u4e86\u907f\u514d\u5927\u6570\u8d8a\u754c\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u6765\u8ba1\u7b97\u4e2d\u70b9\u3002

    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 - i) / 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 - i) / 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\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# \u7406\u8bba\u4e0a Python \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u9700\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:\ni = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelif nums[m] > target:\nj = m - 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\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-i)/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 - i) / 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 - i) / 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 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\nint i = 0, j = len - 1;\n// \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\nwhile (i <= j) {\nint m = i + (j - i) / 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.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target) {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\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 - i) / 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 - i) / 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 - i) / 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

    \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\u533a\u95f4\uff0c\u56e0\u6b64\u4e8c\u5206\u5faa\u73af\u6b21\u6570\u4e3a \\(\\log_2 n\\) \u3002

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

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1. \u00a0 \u533a\u95f4\u8868\u793a\u65b9\u6cd5","text":"

    \u9664\u4e86\u4e0a\u8ff0\u7684\u53cc\u95ed\u533a\u95f4\u5916\uff0c\u5e38\u89c1\u7684\u533a\u95f4\u8868\u793a\u8fd8\u6709\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u533a\u95f4\uff0c\u5b9a\u4e49\u4e3a \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8be5\u8868\u793a\u4e0b\uff0c\u533a\u95f4 \\([i, j]\\) \u5728 \\(i = j\\) \u65f6\u4e3a\u7a7a\u3002

    \u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u8be5\u8868\u793a\u5b9e\u73b0\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search.java
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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_search_lcro(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:\ni = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\nelif nums[m] > target:\nj = m  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\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\u5de6\u95ed\u53f3\u5f00\uff09 */\nfunc binarySearchLCRO(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-i)/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 binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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 binarySearchLCRO(int *nums, int len, 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 = 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) {\nint m = i + (j - i) / 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.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\uff09 */\nint binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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 binarySearchLCRO(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 - i) / 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

    \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5728\u4e24\u79cd\u533a\u95f4\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u5faa\u73af\u6761\u4ef6\u548c\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

    \u5728\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u6cd5\u4e2d\uff0c\u7531\u4e8e\u5de6\u53f3\u8fb9\u754c\u90fd\u88ab\u5b9a\u4e49\u4e3a\u95ed\u533a\u95f4\uff0c\u56e0\u6b64\u6307\u9488 \\(i\\) \u548c \\(j\\) \u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

    Fig. \u4e24\u79cd\u533a\u95f4\u5b9a\u4e49

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2. \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u4e8c\u5206\u67e5\u627e\u5728\u65f6\u95f4\u548c\u7a7a\u95f4\u65b9\u9762\u90fd\u6709\u8f83\u597d\u7684\u6027\u80fd\uff1a

    • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u6548\u7387\u9ad8\u3002\u5728\u5927\u6570\u636e\u91cf\u4e0b\uff0c\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5177\u6709\u663e\u8457\u4f18\u52bf\u3002\u4f8b\u5982\uff0c\u5f53\u6570\u636e\u5927\u5c0f \\(n = 2^{20}\\) \u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u9700\u8981 \\(2^{20} = 1048576\\) \u8f6e\u5faa\u73af\uff0c\u800c\u4e8c\u5206\u67e5\u627e\u4ec5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f6e\u5faa\u73af\u3002
    • \u4e8c\u5206\u67e5\u627e\u65e0\u9700\u989d\u5916\u7a7a\u95f4\u3002\u76f8\u8f83\u4e8e\u9700\u8981\u501f\u52a9\u989d\u5916\u7a7a\u95f4\u7684\u641c\u7d22\u7b97\u6cd5\uff08\u4f8b\u5982\u54c8\u5e0c\u67e5\u627e\uff09\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

    \u7136\u800c\uff0c\u4e8c\u5206\u67e5\u627e\u5e76\u975e\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\uff0c\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_searching/binary_search_edge/","title":"10.2. \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c","text":"

    \u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u9898\u76ee\u89c4\u5b9a\u6570\u7ec4\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\u3002\u5982\u679c\u76ee\u6807\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u591a\u6b21\u51fa\u73b0\uff0c\u4e0a\u8282\u4ecb\u7ecd\u7684\u65b9\u6cd5\u53ea\u80fd\u4fdd\u8bc1\u8fd4\u56de\u5176\u4e2d\u4e00\u4e2a\u76ee\u6807\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u800c\u65e0\u6cd5\u786e\u5b9a\u8be5\u7d22\u5f15\u7684\u5de6\u8fb9\u548c\u53f3\u8fb9\u8fd8\u6709\u591a\u5c11\u76ee\u6807\u5143\u7d20\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u6570\u7ec4\u4e2d\u9996\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    "},{"location":"chapter_searching/binary_search_edge/#1021","title":"10.2.1. \u00a0 \u7b80\u5355\u65b9\u6cd5","text":"

    \u4e3a\u4e86\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5de6\u8fb9\u7684 target \uff0c\u6211\u4eec\u53ef\u4ee5\u5206\u4e3a\u4e24\u6b65\uff1a

    1. \u8fdb\u884c\u4e8c\u5206\u67e5\u627e\uff0c\u5b9a\u4f4d\u5230\u4efb\u610f\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\(k\\) \uff1b
    2. \u4ee5\u7d22\u5f15 \\(k\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u5411\u5de6\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u627e\u5230\u6700\u5de6\u8fb9\u7684 target \u8fd4\u56de\u5373\u53ef\u3002

    Fig. \u7ebf\u6027\u67e5\u627e\u6700\u5de6\u8fb9\u7684\u5143\u7d20

    \u8fd9\u4e2a\u65b9\u6cd5\u867d\u7136\u6709\u6548\uff0c\u4f46\u7531\u4e8e\u5305\u542b\u7ebf\u6027\u67e5\u627e\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u80fd\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002

    "},{"location":"chapter_searching/binary_search_edge/#1022","title":"10.2.2. \u00a0 \u4e8c\u5206\u65b9\u6cd5","text":"

    \u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u4ec5\u901a\u8fc7\u4e8c\u5206\u67e5\u627e\u89e3\u51b3\u4ee5\u4e0a\u95ee\u9898\u3002\u6574\u4f53\u7b97\u6cd5\u6d41\u7a0b\u4e0d\u53d8\uff0c\u5148\u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65ad target \u548c nums[m] \u5927\u5c0f\u5173\u7cfb\uff1a

    • \u5f53 nums[m] < target \u6216 nums[m] > target \u65f6\uff0c\u8bf4\u660e\u8fd8\u6ca1\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u91c7\u53d6\u4e0e\u4e0a\u8282\u4ee3\u7801\u76f8\u540c\u7684\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
    • \u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u201c\u5c0f\u4e8e target \u7684\u5143\u7d20\u201d\u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u91c7\u7528 \\(j = m - 1\\) \u6765\u7f29\u5c0f\u533a\u95f4\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(j\\) \u5411\u5c0f\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u4e8c\u5206\u67e5\u627e\u5b8c\u6210\u540e\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u8fb9\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(i\\) \u5373\u53ef\u3002

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

    \u6ce8\u610f\uff0c\u6570\u7ec4\u53ef\u80fd\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20 target \u3002\u56e0\u6b64\u5728\u51fd\u6570\u8fd4\u56de\u524d\uff0c\u6211\u4eec\u9700\u8981\u5148\u5224\u65ad nums[i] \u4e0e target \u662f\u5426\u76f8\u7b49\uff0c\u4ee5\u53ca\u7d22\u5f15 \\(i\\) \u662f\u5426\u8d8a\u754c\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchLeftEdge(int[] nums, int target) {\nint i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\nj = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n}\nif (i == nums.length || nums[i] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn i;\n}\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\nint i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\nj = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n}\nif (i == nums.size() || nums[i] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn i;\n}\n
    binary_search_edge.py
    def binary_search_left_edge(nums: list[int], target: int) -> int:\n\"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20\"\"\"\ni, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile i <= j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:\ni = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelif nums[m] > target:\nj = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse:\nj = m - 1  # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\nif i == len(nums) or nums[i] != target:\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn i\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\ni, j := 0, len(nums)-1\nfor i <= j {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nm := i + (j-i)/2\nif nums[m] < target {\n// target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target {\n// target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else {\n// \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n}\n}\nif i == len(nums) || nums[i] != target {\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\nreturn i\n}\n
    binary_search_edge.js
    [class]{}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.ts
    [class]{}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.c
    [class]{}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.cs
    [class]{binary_search_edge}-[func]{binarySearchLeftEdge}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nvar i = 0\nvar j = nums.count - 1\nwhile i <= j {\nlet m = i + (j - 1) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target {\ni = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n} else if nums[m] > target {\nj = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n} else {\nj = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n}\n}\nif i == nums.count || nums[i] != target {\nreturn -1 // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\nreturn i\n}\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchLeftEdge}\n
    "},{"location":"chapter_searching/binary_search_edge/#1023","title":"10.2.3. \u00a0 \u67e5\u627e\u53f3\u8fb9\u754c","text":"

    \u7c7b\u4f3c\u5730\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u8fb9\u7684 target \u3002\u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c i = m + 1 \uff0c\u4f7f\u5f97\u6307\u9488 \\(i\\) \u5411\u5927\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u5b8c\u6210\u4e8c\u5206\u540e\uff0c\\(i\\) \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u6700\u53f3\u8fb9\u7684 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(j\\) \u5373\u53ef\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchRightEdge(int[] nums, int target) {\nint i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\ni = m + 1; // \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\n}\nif (j < 0 || nums[j] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn j;\n}\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nint binarySearchRightEdge(vector<int> &nums, int target) {\nint i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile (i <= j) {\nint m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif (nums[m] < target)\ni = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelse if (nums[m] > target)\nj = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse\ni = m + 1; // \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\n}\nif (j < 0 || nums[j] != target)\nreturn -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn j;\n}\n
    binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n\"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20\"\"\"\ni, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nwhile i <= j:\nm = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target:\ni = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\nelif nums[m] > target:\nj = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nelse:\ni = m + 1  # \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\nif j == len(nums) or nums[j] != target:\nreturn -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn j\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchRightEdge(nums []int, target int) int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\ni, j := 0, len(nums)-1\nfor i <= j {\n// \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nm := i + (j-i)/2\nif nums[m] < target {\n// target \u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n} else if nums[m] > target {\n// target \u5728\u533a\u95f4 [i, m-1] \u4e2d\nj = m - 1\n} else {\n// \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\ni = m + 1\n}\n}\nif j < 0 || nums[j] != target {\n// \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nreturn -1\n}\nreturn j\n}\n
    binary_search_edge.js
    [class]{}-[func]{binarySearchRightEdge}\n
    binary_search_edge.ts
    [class]{}-[func]{binarySearchRightEdge}\n
    binary_search_edge.c
    [class]{}-[func]{binarySearchRightEdge}\n
    binary_search_edge.cs
    [class]{binary_search_edge}-[func]{binarySearchRightEdge}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a\u5143\u7d20 */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n// \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\nvar i = 0\nvar j = nums.count - 1\nwhile i <= j {\nlet m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\nif nums[m] < target {\ni = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n} else if nums[m] > target {\nj = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n} else {\ni = m + 1 // \u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [m+1, j] \u4e2d\n}\n}\nif j < 0 || nums[j] != target {\nreturn -1 // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\nreturn j\n}\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchRightEdge}\n

    \u89c2\u5bdf\u4e0b\u56fe\uff0c\u641c\u7d22\u6700\u53f3\u8fb9\u5143\u7d20\u65f6\u6307\u9488 \\(j\\) \u7684\u4f5c\u7528\u4e0e\u641c\u7d22\u6700\u5de6\u8fb9\u5143\u7d20\u65f6\u6307\u9488 \\(i\\) \u7684\u4f5c\u7528\u4e00\u81f4\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u641c\u7d22\u6700\u5de6\u8fb9\u5143\u7d20\u548c\u6700\u53f3\u8fb9\u5143\u7d20\u7684\u5b9e\u73b0\u662f\u955c\u50cf\u5bf9\u79f0\u7684\u3002

    Fig. \u67e5\u627e\u6700\u5de6\u8fb9\u548c\u6700\u53f3\u8fb9\u5143\u7d20\u7684\u5bf9\u79f0\u6027

    Tip

    \u4ee5\u4e0a\u4ee3\u7801\u91c7\u53d6\u7684\u90fd\u662f\u201c\u53cc\u95ed\u533a\u95f4\u201d\u5199\u6cd5\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u5199\u6cd5\u3002

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

    \u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u5e38\u901a\u8fc7\u5c06\u7ebf\u6027\u67e5\u627e\u66ff\u6362\u4e3a\u54c8\u5e0c\u67e5\u627e\u6765\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u7b97\u6cd5\u9898\u6765\u52a0\u6df1\u7406\u89e3\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u5143\u7d20 target \uff0c\u8bf7\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u201c\u548c\u201d\u4e3a target \u7684\u4e24\u4e2a\u5143\u7d20\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u4e2a\u89e3\u5373\u53ef\u3002

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

    Fig. \u7ebf\u6027\u67e5\u627e\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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
    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
    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
    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
    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
    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
    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
    two_sum.cs
    /* \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
    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
    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/#1032","title":"10.3.2. \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

    \u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u952e\u503c\u5bf9\u5206\u522b\u4e3a\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u6267\u884c\uff1a

    1. \u5224\u65ad\u6570\u5b57 target - nums[i] \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\u5219\u76f4\u63a5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1b
    2. \u5c06\u952e\u503c\u5bf9 nums[i] \u548c\u7d22\u5f15 i \u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\uff1b
    <1><2><3>

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff0c\u4ec5\u9700\u5355\u5c42\u5faa\u73af\u5373\u53ef\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig 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
    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
    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
    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
    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
    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
    two_sum.c
    /* \u54c8\u5e0c\u8868 */\nstruct hashTable {\nint key;\nint val;\nUT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n};\ntypedef struct hashTable hashTable;\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
    two_sum.cs
    /* \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)\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++) {\nif (dic.ContainsKey(target - nums[i])) {\nreturn new int[] { dic[target - nums[i]], i };\n}\ndic.Add(nums[i], i);\n}\nreturn new int[0];\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n// \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6 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
    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":"10.4. \u00a0 \u91cd\u8bc6\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

    \u6839\u636e\u5b9e\u73b0\u601d\u8def\uff0c\u641c\u7d22\u7b97\u6cd5\u603b\u4f53\u53ef\u5206\u4e3a\u4e24\u79cd\uff1a

    • \u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\uff0c\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u7b49\u3002
    • \u5229\u7528\u6570\u636e\u7ec4\u7ec7\u7ed3\u6784\u6216\u6570\u636e\u5305\u542b\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u5b9e\u73b0\u9ad8\u6548\u5143\u7d20\u67e5\u627e\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u548c\u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u7b49\u3002

    \u4e0d\u96be\u53d1\u73b0\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u70b9\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u56e0\u6b64\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ece\u66f4\u52a0\u7cfb\u7edf\u7684\u89c6\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5ba1\u89c6\u641c\u7d22\u7b97\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1041","title":"10.4.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/#1042","title":"10.4.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/#1043","title":"10.4.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":"10.5. \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.3. \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

    \u300c\u5192\u6ce1\u6392\u5e8f Bubble Sort\u300d\u901a\u8fc7\u8fde\u7eed\u5730\u6bd4\u8f83\u4e0e\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u5b9e\u73b0\u6392\u5e8f\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u6c14\u6ce1\u4ece\u5e95\u90e8\u5347\u5230\u9876\u90e8\u4e00\u6837\uff0c\u56e0\u6b64\u5f97\u540d\u5192\u6ce1\u6392\u5e8f\u3002

    \u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u4e0a\u8ff0\u8fc7\u7a0b\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

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

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

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

    1. \u9996\u5148\uff0c\u5bf9 \\(n\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\uff0c
    2. \u63a5\u4e0b\u6765\uff0c\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u201c\u5192\u6ce1\u201d\u540e\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    4. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u65e0\u9700\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002

    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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.size() - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = len(nums)\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in range(n - 1, 0, -1):\n# \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := len(nums) - 1; i > 0; i-- {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = 0; i < size - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.Length - 1; i > 0; i--) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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.swift
    /* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nvar i: usize = nums.len - 1;\nwhile (i > 0) : (i -= 1) {\nvar j: usize = 0;\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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/#1132","title":"11.3.2. \u00a0 \u6548\u7387\u4f18\u5316","text":"

    \u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u201c\u5192\u6ce1\u201d\u4e2d\u6ca1\u6709\u6267\u884c\u4efb\u4f55\u4ea4\u6362\u64cd\u4f5c\uff0c\u8bf4\u660e\u6570\u7ec4\u5df2\u7ecf\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d flag \u6765\u76d1\u6d4b\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e00\u65e6\u51fa\u73b0\u5c31\u7acb\u5373\u8fd4\u56de\u3002

    \u7ecf\u8fc7\u4f18\u5316\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u5dee\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.length - 1; i > 0; i--) {\nboolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.size() - 1; i > 0; i--) {\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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 = len(nums)\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i in range(n - 1, 0, -1):\nflag = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n# \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := len(nums) - 1; i > 0; i-- {\nflag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (let i = nums.length - 1; i > 0; i--) {\nlet flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = 0; i < size - 1; i++) {\nbool flag = false;\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor (int i = nums.Length - 1; i > 0; i--) {\nbool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n// \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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) 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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\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\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef \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/bubble_sort/#1133","title":"11.3.3. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3001\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5404\u8f6e\u201c\u5192\u6ce1\u201d\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\) , \\(n - 2\\) , \\(\\cdots\\) , \\(2\\) , \\(1\\) \uff0c\u603b\u548c\u4e3a \\(\\frac{(n - 1) n}{2}\\) \u3002\u5728\u5f15\u5165 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\u3002
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8. \u00a0 \u6876\u6392\u5e8f","text":"

    \u524d\u8ff0\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/#1181","title":"11.8.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 * float64(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// \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++) {\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// \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// \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) {\nforeach (float num in bucket) {\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/#1182","title":"11.8.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
    • \u81ea\u9002\u5e94\u6392\u5e8f\uff1a\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\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n + k)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u6876\u6392\u5e8f\u662f\u5426\u7a33\u5b9a\u53d6\u51b3\u4e8e\u6392\u5e8f\u6876\u5185\u5143\u7d20\u7684\u7b97\u6cd5\u662f\u5426\u7a33\u5b9a\u3002
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3. \u00a0 \u5982\u4f55\u5b9e\u73b0\u5e73\u5747\u5206\u914d","text":"

    \u6876\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7406\u8bba\u4e0a\u53ef\u4ee5\u8fbe\u5230 \\(O(n)\\) \uff0c\u5173\u952e\u5728\u4e8e\u5c06\u5143\u7d20\u5747\u5300\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u56e0\u4e3a\u5b9e\u9645\u6570\u636e\u5f80\u5f80\u4e0d\u662f\u5747\u5300\u5206\u5e03\u7684\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u8981\u5c06\u6dd8\u5b9d\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u4ef7\u683c\u8303\u56f4\u5e73\u5747\u5206\u914d\u5230 10 \u4e2a\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u4ef7\u683c\u5206\u5e03\u4e0d\u5747\uff0c\u4f4e\u4e8e 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u4e8e 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c06\u4ef7\u683c\u533a\u95f4\u5e73\u5747\u5212\u5206\u4e3a 10 \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.9. \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/#1191","title":"11.9.1. \u00a0 \u7b80\u5355\u5b9e\u73b0","text":"

    \u5148\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u3002\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8d1f\u6574\u6570\u201d\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) * m);\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// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in 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];\nforeach (int num in 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.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/#1192","title":"11.9.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) * m);\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// 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\nint m = 0;\nforeach (int num in 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];\nforeach (int num in 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.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/#1193","title":"11.9.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)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u987a\u5e8f\u662f\u201c\u4ece\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u904d\u5386 nums \u53ef\u4ee5\u907f\u514d\u6539\u53d8\u76f8\u7b49\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b9e\u73b0\u7a33\u5b9a\u6392\u5e8f\u3002\u5b9e\u9645\u4e0a\uff0c\u6b63\u5e8f\u904d\u5386 nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\uff0c\u4f46\u7ed3\u679c\u662f\u975e\u7a33\u5b9a\u7684\u3002
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4. \u00a0 \u5c40\u9650\u6027","text":"

    \u770b\u5230\u8fd9\u91cc\uff0c\u4f60\u4e5f\u8bb8\u4f1a\u89c9\u5f97\u8ba1\u6570\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u4ec5\u901a\u8fc7\u7edf\u8ba1\u6570\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9ad8\u6548\u7684\u6392\u5e8f\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/heap_sort/","title":"11.7. \u00a0 \u5806\u6392\u5e8f","text":"

    Tip

    \u9605\u8bfb\u672c\u8282\u524d\uff0c\u8bf7\u786e\u4fdd\u5df2\u5b66\u5b8c\u300c\u5806\u300d\u7ae0\u8282\u3002

    \u300c\u5806\u6392\u5e8f Heap Sort\u300d\u662f\u4e00\u79cd\u57fa\u4e8e\u5806\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\u7684\u9ad8\u6548\u6392\u5e8f\u7b97\u6cd5\u3002\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5df2\u7ecf\u5b66\u8fc7\u7684\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\u5806\u6392\u5e8f\uff1a

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5c0f\u9876\u5806\uff0c\u6b64\u65f6\u6700\u5c0f\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u4e0d\u65ad\u6267\u884c\u51fa\u5806\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8bb0\u5f55\u51fa\u5806\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

    \u4ee5\u4e0a\u65b9\u6cd5\u867d\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u989d\u5916\u6570\u7ec4\u6765\u4fdd\u5b58\u5f39\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f83\u6d6a\u8d39\u7a7a\u95f4\u3002\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4e00\u79cd\u66f4\u52a0\u4f18\u96c5\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5806\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5927\u9876\u5806\u3002\u5b8c\u6210\u540e\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u5c06\u5806\u9876\u5143\u7d20\uff08\u7b2c\u4e00\u4e2a\u5143\u7d20\uff09\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff09\u4ea4\u6362\u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u5806\u7684\u957f\u5ea6\u51cf \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u52a0 \\(1\\) \u3002
    3. \u4ece\u5806\u9876\u5143\u7d20\u5f00\u59cb\uff0c\u4ece\u9876\u5230\u5e95\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff08Sift Down\uff09\u3002\u5b8c\u6210\u5806\u5316\u540e\uff0c\u5806\u7684\u6027\u8d28\u5f97\u5230\u4fee\u590d\u3002
    4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u548c 3. \u6b65\u3002\u5faa\u73af \\(n - 1\\) \u8f6e\u540e\uff0c\u5373\u53ef\u5b8c\u6210\u6570\u7ec4\u6392\u5e8f\u3002

    \u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u548c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u4e2a\u5f39\u51fa\u5143\u7d20\u7684\u6b65\u9aa4\u3002

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

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e0e\u5806\u7ae0\u8282\u76f8\u540c\u7684\u4ece\u9876\u81f3\u5e95\u5806\u5316\uff08Sift Down\uff09\u7684\u51fd\u6570\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u5806\u7684\u957f\u5ea6\u4f1a\u968f\u7740\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u51cf\u5c0f\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u7ed9 Sift Down \u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u957f\u5ea6\u53c2\u6570 \\(n\\) \uff0c\u7528\u4e8e\u6307\u5b9a\u5806\u7684\u5f53\u524d\u6709\u6548\u957f\u5ea6\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig heap_sort.java
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = 2 * i + 1;\nint r = 2 * i + 2;\nint ma = i;\nif (l < n && nums[l] > nums[ma])\nma = l;\nif (r < n && nums[r] > nums[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\nint temp = nums[i];\nnums[i] = nums[ma];\nnums[ma] = temp;\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = nums.length / 2 - 1; i >= 0; i--) {\nsiftDown(nums, nums.length, i);\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor (int i = nums.length - 1; i > 0; i--) {\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nint tmp = nums[0];\nnums[0] = nums[i];\nnums[i] = tmp;\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums, i, 0);\n}\n}\n
    heap_sort.cpp
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\nwhile (true) {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nint l = 2 * i + 1;\nint r = 2 * i + 2;\nint ma = i;\nif (l < n && nums[l] > nums[ma])\nma = l;\nif (r < n && nums[r] > nums[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}\n// \u4ea4\u6362\u4e24\u8282\u70b9\nswap(nums[i], nums[ma]);\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma;\n}\n}\n/* \u5806\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor (int i = nums.size() / 2 - 1; i >= 0; --i) {\nsiftDown(nums, nums.size(), i);\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor (int i = nums.size() - 1; i > 0; --i) {\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(nums[0], nums[i]);\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums, i, 0);\n}\n}\n
    heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n\"\"\"\u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\nwhile True:\n# \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nl = 2 * i + 1\nr = 2 * i + 2\nma = i\nif l < n and nums[l] > nums[ma]:\nma = l\nif r < n and nums[r] > nums[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\nnums[i], nums[ma] = nums[ma], nums[i]\n# \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\ndef heap_sort(nums: list[int]):\n\"\"\"\u5806\u6392\u5e8f\"\"\"\n# \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in range(len(nums) // 2 - 1, -1, -1):\nsift_down(nums, len(nums), i)\n# \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor i in range(len(nums) - 1, 0, -1):\n# \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nnums[0], nums[i] = nums[i], nums[0]\n# \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsift_down(nums, i, 0)\n
    heap_sort.go
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\nfor true {\n// \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\nl := 2*i + 1\nr := 2*i + 2\nma := i\nif l < n && (*nums)[l] > (*nums)[ma] {\nma = l\n}\nif r < n && (*nums)[r] > (*nums)[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\n(*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n}\n}\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i := len(*nums)/2 - 1; i >= 0; i-- {\nsiftDown(nums, len(*nums), i)\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor i := len(*nums) - 1; i > 0; i-- {\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n(*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums, i, 0)\n}\n}\n
    heap_sort.js
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    heap_sort.ts
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    heap_sort.c
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    heap_sort.cs
    [class]{heap_sort}-[func]{siftDown}\n[class]{heap_sort}-[func]{heapSort}\n
    heap_sort.swift
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\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 = 2 * i + 1\nlet r = 2 * i + 2\nvar ma = i\nif l < n, nums[l] > nums[ma] {\nma = l\n}\nif r < n, nums[r] > nums[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\nnums.swapAt(i, ma)\n// \u5faa\u73af\u5411\u4e0b\u5806\u5316\ni = ma\n}\n}\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n// \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\nfor i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\nsiftDown(nums: &nums, n: nums.count, i: i)\n}\n// \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\nfor i in stride(from: nums.count - 1, to: 0, by: -1) {\n// \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u5373\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\nnums.swapAt(0, i)\n// \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\nsiftDown(nums: &nums, n: i, i: 0)\n}\n}\n
    heap_sort.zig
    [class]{}-[func]{siftDown}\n[class]{}-[func]{heapSort}\n
    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5efa\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff0c\u5171\u5faa\u73af \\(n - 1\\) \u8f6e\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f \uff1a\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u4f7f\u7528 \\(O(1)\\) \u7a7a\u95f4\u3002\u5143\u7d20\u4ea4\u6362\u548c\u5806\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5806\u9876\u5143\u7d20\u548c\u5806\u5e95\u5143\u7d20\u65f6\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002
    "},{"location":"chapter_sorting/insertion_sort/","title":"11.4. \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

    \u300c\u63d2\u5165\u6392\u5e8f Insertion Sort\u300d\u662f\u4e00\u79cd\u7b80\u5355\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u624b\u52a8\u6574\u7406\u4e00\u526f\u724c\u7684\u8fc7\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

    \u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u4e00\u4e2a\u57fa\u51c6\u5143\u7d20\uff0c\u5c06\u8be5\u5143\u7d20\u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u8be5\u5143\u7d20\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

    \u56de\u5fc6\u6570\u7ec4\u7684\u5143\u7d20\u63d2\u5165\u64cd\u4f5c\uff0c\u8bbe\u57fa\u51c6\u5143\u7d20\u4e3a base \uff0c\u6211\u4eec\u9700\u8981\u5c06\u4ece\u76ee\u6807\u7d22\u5f15\u5230 base \u4e4b\u95f4\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u518d\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

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

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

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

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6570\u7ec4\u7684\u7b2c 1 \u4e2a\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
    2. \u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

    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\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base;        // \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\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // \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\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\nfor i in range(1, len(nums)):\nbase = nums[i]\nj = i - 1\n# \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0 and nums[j] > base:\nnums[j + 1] = nums[j]  # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\nnums[j + 1] = base  # \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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\nfor i := 1; i < len(nums); i++ {\nbase := nums[i]\nj := i - 1\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nfor j >= 0 && nums[j] > base {\nnums[j+1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--\n}\nnums[j+1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.js
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.ts
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.c
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\nfor (int i = 1; i < size; i++) {\nint base = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > base) {\n// \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nnums[j + 1] = nums[j];\nj--;\n}\n// \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// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\nfor (int i = 1; i < nums.Length; i++) {\nint bas = nums[i], j = i - 1;\n// \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 0 && nums[j] > bas) {\nnums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj--;\n}\nnums[j + 1] = bas;         // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    insertion_sort.swift
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile j >= 0, nums[j] > base {\nnums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\nj -= 1\n}\nnums[j + 1] = base // \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\uff1a\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u4e3a 1, 2, ..., n\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\u5df2\u6392\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\nwhile (j >= 1 and nums[j - 1] > base) : (j -= 1) {\nnums[j] = nums[j - 1];  // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n}\nnums[j] = base;             // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n}\n}\n
    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n^2)\\) \u3001\u81ea\u9002\u5e94\u6392\u5e8f \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\u5728\u9047\u5230\u6709\u5e8f\u6570\u636e\u65f6\uff0c\u63d2\u5165\u64cd\u4f5c\u4f1a\u63d0\u524d\u7ec8\u6b62\u3002\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u63d2\u5165\u6392\u5e8f\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f \uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u5c06\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\uff0c\u4e0d\u4f1a\u6539\u53d8\u5b83\u4eec\u7684\u987a\u5e8f\u3002
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3. \u00a0 \u63d2\u5165\u6392\u5e8f\u4f18\u52bf","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u800c\u6211\u4eec\u5373\u5c06\u5b66\u4e60\u7684\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u6bd4\u5feb\u901f\u6392\u5e8f\u66f4\u9ad8\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

    \u8fd9\u4e2a\u7ed3\u8bba\u4e0e\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u7684\u9002\u7528\u60c5\u51b5\u7684\u7ed3\u8bba\u7c7b\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u8fd9\u7c7b \\(O(n \\log n)\\) \u7684\u7b97\u6cd5\u5c5e\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6570\u503c\u6bd4\u8f83\u63a5\u8fd1\uff0c\u590d\u6742\u5ea6\u4e0d\u5360\u4e3b\u5bfc\u4f5c\u7528\uff1b\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u8d77\u5230\u51b3\u5b9a\u6027\u56e0\u7d20\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\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\u5feb\u901f\u6392\u5e8f\uff1b\u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

    \u867d\u7136\u5192\u6ce1\u6392\u5e8f\u3001\u9009\u62e9\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u9891\u7387\u663e\u8457\u9ad8\u4e8e\u5192\u6ce1\u6392\u5e8f\u548c\u9009\u62e9\u6392\u5e8f\u3002\u8fd9\u662f\u56e0\u4e3a\uff1a

    • \u5192\u6ce1\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u4ea4\u6362\u5b9e\u73b0\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5171\u6d89\u53ca 3 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002\u5982\u679c\u7ed9\u5b9a\u4e00\u7ec4\u90e8\u5206\u6709\u5e8f\u7684\u6570\u636e\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9009\u62e9\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u4e0d\u7a33\u5b9a\uff0c\u65e0\u6cd5\u5e94\u7528\u4e8e\u591a\u7ea7\u6392\u5e8f\u3002
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6. \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

    \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/#1161","title":"11.6.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(nums[left : right + 1])\n# \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nleft_start = 0\nleft_end = mid - left\n# \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\nright_start = mid + 1 - left\nright_end = right - left\n# i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\ni = left_start\nj = 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 = (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// \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// \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) 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/#1162","title":"11.6.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5212\u5206\u4ea7\u751f\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u5c42\u5408\u5e76\u7684\u603b\u64cd\u4f5c\u6570\u91cf\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002\u5408\u5e76\u64cd\u4f5c\u9700\u8981\u501f\u52a9\u8f85\u52a9\u6570\u7ec4\u5b9e\u73b0\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\u3002
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3. \u00a0 \u94fe\u8868\u6392\u5e8f *","text":"

    \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.5. \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
    /* \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/* \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) {\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.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/#1151","title":"11.5.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\u672a\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 = 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// \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/#1152","title":"11.5.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\log n)\\) \u3001\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u5728\u5e73\u5747\u60c5\u51b5\u4e0b\uff0c\u54e8\u5175\u5212\u5206\u7684\u9012\u5f52\u5c42\u6570\u4e3a \\(\\log n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u603b\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n \\log n)\\) \u65f6\u95f4\u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u5212\u5206\u4e3a\u957f\u5ea6\u4e3a \\(0\\) \u548c \\(n - 1\\) \u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u6b64\u65f6\u9012\u5f52\u5c42\u6570\u8fbe\u5230 \\(n\\) \u5c42\uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3001\u539f\u5730\u6392\u5e8f \uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\uff0c\u672a\u501f\u52a9\u989d\u5916\u6570\u7ec4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5212\u5206\u7684\u6700\u540e\u4e00\u6b65\uff0c\u57fa\u51c6\u6570\u53ef\u80fd\u4f1a\u88ab\u4ea4\u6362\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\u3002
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3. \u00a0 \u5feb\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/#1154","title":"11.5.4. \u00a0 \u57fa\u51c6\u6570\u4f18\u5316","text":"

    \u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\u7684\u65f6\u95f4\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u4f8b\u5b50\uff0c\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u4e8e\u6211\u4eec\u9009\u62e9\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u5728\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u57fa\u51c6\u6570\u88ab\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u53f3\u7aef\uff0c\u5bfc\u81f4\u5de6\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n - 1\\) \u3001\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \u3002\u5982\u6b64\u9012\u5f52\u4e0b\u53bb\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\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 = 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// \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.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/#1155","title":"11.5.5. \u00a0 \u5c3e\u9012\u5f52\u4f18\u5316","text":"

    \u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u5360\u7528\u7a7a\u95f4\u8f83\u591a\u3002\u4ee5\u5b8c\u5168\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\u672a\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\u672a\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\u672a\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\u672a\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 = 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\u672a\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\u672a\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums, left, right) {\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\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\u672a\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\u672a\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n// \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\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\u672a\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\u672a\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\u672a\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\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n}\n}\n}\n
    "},{"location":"chapter_sorting/radix_sort/","title":"11.10. \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/#11101","title":"11.10.1. \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u4ee5\u5b66\u53f7\u6570\u636e\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6570\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6570\u6392\u5e8f\u7684\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 \\bmod d \\]

    \u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\space 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// \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}\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 = int.MinValue;\nforeach (int num in nums) {\nif (num > m) m = num;\n}\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}\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/#11102","title":"11.10.2. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

    \u76f8\u8f83\u4e8e\u8ba1\u6570\u6392\u5e8f\uff0c\u57fa\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u503c\u8303\u56f4\u8f83\u5927\u7684\u60c5\u51b5\uff0c\u4f46\u524d\u63d0\u662f\u6570\u636e\u5fc5\u987b\u53ef\u4ee5\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6570\u4e0d\u80fd\u8fc7\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u70b9\u6570\u4e0d\u9002\u5408\u4f7f\u7528\u57fa\u6570\u6392\u5e8f\uff0c\u56e0\u4e3a\u5176\u4f4d\u6570 \\(k\\) \u8fc7\u5927\uff0c\u53ef\u80fd\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6 \\(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)\\) \u3001\u975e\u539f\u5730\u6392\u5e8f \uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6570\u6392\u5e8f\u9700\u8981\u501f\u52a9\u957f\u5ea6\u4e3a \\(n\\) \u548c \\(d\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\u3002
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2. \u00a0 \u9009\u62e9\u6392\u5e8f","text":"

    \u300c\u9009\u62e9\u6392\u5e8f Selection Sort\u300d\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u76f4\u63a5\uff1a\u5f00\u542f\u4e00\u4e2a\u5faa\u73af\uff0c\u6bcf\u8f6e\u4ece\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c06\u5176\u653e\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u672b\u5c3e\u3002

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u9009\u62e9\u6392\u5e8f\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u4e0b\uff1a

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u533a\u95f4\u4e3a \\([0, n-1]\\) \u3002
    2. \u9009\u53d6\u533a\u95f4 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(0\\) \u5904\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 1 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u533a\u95f4 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(1\\) \u5904\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\u3002\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u9009\u62e9\u4e0e\u4ea4\u6362\u540e\uff0c\u6570\u7ec4\u524d \\(n - 1\\) \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    5. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u65e0\u9700\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u7528 \\(k\\) \u6765\u8bb0\u5f55\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\u3002

    JavaC++PythonGoJavaScriptTypeScriptCC#SwiftZig selection_sort.java
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\nint n = nums.length;\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor (int i = 0; i < n - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nint k = i;\nfor (int j = i + 1; j < n; j++) {\nif (nums[j] < nums[k])\nk = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nint temp = nums[i];\nnums[i] = nums[k];\nnums[k] = temp;\n}\n}\n
    selection_sort.cpp
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\nint n = nums.size();\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor (int i = 0; i < n - 1; i++) {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nint k = i;\nfor (int j = i + 1; j < n; j++) {\nif (nums[j] < nums[k])\nk = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nswap(nums[i], nums[k]);\n}\n}\n
    selection_sort.py
    def selection_sort(nums: list[int]):\n\"\"\"\u9009\u62e9\u6392\u5e8f\"\"\"\nn = len(nums)\n# \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor i in range(n - 1):\n# \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nk = i\nfor j in range(i + 1, n):\nif nums[j] < nums[k]:\nk = j  # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n# \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nnums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.go
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums []int) {\nn := len(nums)\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor i := 0; i < n-1; i++ {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nk := i\nfor j := i + 1; j < n; j++ {\nif nums[j] < nums[k] {\n// \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\nk = j\n}\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nnums[i], nums[k] = nums[k], nums[i]\n}\n}\n
    selection_sort.js
    [class]{}-[func]{selectionSort}\n
    selection_sort.ts
    [class]{}-[func]{selectionSort}\n
    selection_sort.c
    [class]{}-[func]{selectionSort}\n
    selection_sort.cs
    [class]{selection_sort}-[func]{selectionSort}\n
    selection_sort.swift
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n// \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\nfor i in nums.indices.dropLast() {\n// \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\nvar k = i\nfor j in nums.indices.dropFirst(i + 1) {\nif nums[j] < nums[k] {\nk = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n}\n}\n// \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\nnums.swapAt(i, k)\n}\n}\n
    selection_sort.zig
    [class]{}-[func]{selectionSort}\n
    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1. \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5916\u5faa\u73af\u5171 \\(n - 1\\) \u8f6e\uff0c\u7b2c\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6700\u540e\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(2\\) \uff0c\u5373\u5404\u8f6e\u5916\u5faa\u73af\u5206\u522b\u5305\u542b \\(n\\) , \\(n - 1\\) , \\(\\cdots\\) , \\(2\\) \u8f6e\u5185\u5faa\u73af\uff0c\u6c42\u548c\u4e3a \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6 \\(O(1)\\) \u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) , \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5143\u7d20\u65f6\uff0c\u6709\u53ef\u80fd\u5c06 nums[i] \u4ea4\u6362\u81f3\u5176\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u8fb9\uff0c\u5bfc\u81f4\u4e24\u8005\u7684\u76f8\u5bf9\u987a\u5e8f\u53d1\u751f\u6539\u53d8\u3002

    Fig. \u9009\u62e9\u6392\u5e8f\u975e\u7a33\u5b9a\u793a\u4f8b

    "},{"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.11. \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\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u867d\u7136\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u7531\u4e8e\u5355\u5143\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\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\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_sorting/summary/#11111-q-a","title":"11.11.1. \u00a0 Q & A","text":"

    \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_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 = self.front\nres = [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};\ntypedef struct doublyListNode doublyListNode;\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};\ntypedef struct linkedListDeque linkedListDeque;\n/* \u6784\u9020\u51fd\u6570 */\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
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\npublic int val;       // \u8282\u70b9\u503c\npublic ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\npublic ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\npublic ListNode(int val) {\nthis.val = val;\nprev = null;\nnext = 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, \u5c3e\u8282\u70b9 rear\nprivate int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\npublic LinkedListDeque() {\nfront = null;\nrear = 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 bool isEmpty() {\nreturn size() == 0;\n}\n/* \u5165\u961f\u64cd\u4f5c */\nprivate void push(int num, bool isFront) {\nListNode node = new ListNode(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++; // \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 int? pop(bool isFront) {\n// \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\nif (isEmpty()) {\nreturn null;\n}\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}\n// \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\nelse {\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 int? popFirst() {\nreturn pop(true);\n}\n/* \u961f\u5c3e\u51fa\u961f */\npublic int? popLast() {\nreturn pop(false);\n}\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npublic int? peekFirst() {\nreturn isEmpty() ? null : front.val;\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int? 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.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 IndexOutOfBoundsException();\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int peekLast() {\nif (isEmpty())\nthrow new IndexOutOfBoundsException();\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\"\"\"\nif self.is_empty():\nraise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\nreturn self.__nums[self.__front]\ndef peek_last(self) -> int:\n\"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\nif self.is_empty():\nraise IndexError(\"\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};\ntypedef struct arrayDeque arrayDeque;\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
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\nprivate readonly 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 bool 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()) {\nConsole.WriteLine(\"\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()) {\nConsole.WriteLine(\"\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 InvalidOperationException();\n}\nreturn nums[front];\n}\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\npublic int peekLast() {\nif (isEmpty()) {\nthrow new InvalidOperationException();\n}\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.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 IndexOutOfBoundsException();\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};\ntypedef struct linkedListQueue linkedListQueue;\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 {\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 bool 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 if (rear != null) {\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 || front == null)\nthrow new Exception();\nreturn front.val;\n}\n/* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\nif (front == null)\nreturn Array.Empty<int>();\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.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 IndexOutOfBoundsException();\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\"\"\"\nif self.__size == self.capacity():\nraise IndexError(\"\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\u90e8F\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\"\"\"\nif self.is_empty():\nraise IndexError(\"\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 = [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};\ntypedef struct arrayQueue arrayQueue;\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 {\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 bool isEmpty() {\nreturn queSize == 0;\n}\n/* \u5165\u961f */\npublic void push(int num) {\nif (queSize == capacity()) {\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() {\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 Exception();\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 % 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 IndexOutOfBoundsException();\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 = []\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};\ntypedef struct linkedListStack linkedListStack;\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 {\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 bool 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() {\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() {\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() {\nif (stackPeek == null)\nreturn Array.Empty<int>();\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.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 IndexOutOfBoundsException();\nreturn stack.remove(size() - 1);\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new IndexOutOfBoundsException();\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\"\"\"\nif self.is_empty():\nraise IndexError(\"\u6808\u4e3a\u7a7a\")\nreturn self.__stack.pop()\ndef peek(self) -> int:\n\"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\nif self.is_empty():\nraise IndexError(\"\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};\ntypedef struct arrayStack arrayStack;\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 {\nprivate List<int> stack;\npublic ArrayStack() {\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() {\nreturn stack.Count();\n}\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\npublic bool 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 Exception();\nvar val = peek();\nstack.RemoveAt(size() - 1);\nreturn val;\n}\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npublic int peek() {\nif (isEmpty())\nthrow new Exception();\nreturn stack[size() - 1];\n}\n/* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\npublic int[] toArray() {\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":"7.3. \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a","text":"

    \u5728\u94fe\u8868\u8868\u793a\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u5b58\u50a8\u5355\u5143\u4e3a\u8282\u70b9 TreeNode \uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u76f8\u8fde\u63a5\u3002\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/#731","title":"7.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/#732","title":"7.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/#733","title":"7.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":"7.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/#751-avl","title":"7.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// \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.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// \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/#752-avl","title":"7.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) {\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) {\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// \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\nint balanceFactorInt = balanceFactor(node);\n// \u5de6\u504f\u6811\nif (balanceFactorInt > 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 (balanceFactorInt < -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.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/#753-avl","title":"7.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) {\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) 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) {\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) 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 {\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.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\nvar 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/#754-avl","title":"7.5.4. \u00a0 AVL \u6811\u5178\u578b\u5e94\u7528","text":"
    • \u7ec4\u7ec7\u548c\u5b58\u50a8\u5927\u578b\u6570\u636e\uff0c\u9002\u7528\u4e8e\u9ad8\u9891\u67e5\u627e\u3001\u4f4e\u9891\u589e\u5220\u7684\u573a\u666f\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":"7.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/#741","title":"7.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) {\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) cur =\ncur.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.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\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\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\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\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\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\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// \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\nTreeNode node = new TreeNode(num);\nif (pre != null) {\nif (pre.val < num)\npre.right = node;\nelse\npre.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\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\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 (cur != root) {\nif (pre.left == cur)\npre.left = child;\nelse\npre.right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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\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 (cur != root) {\nif (pre->left == cur)\npre->left = child;\nelse\npre->right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = child;\n}\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 cur != self.root:\nif pre.left == cur:\npre.left = child\nelse:\npre.right = child\nelse:\n# \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nself.__root = cur\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// \u5220\u9664\u8282\u70b9 cur\nif cur != bst.root {\nif pre.Left == cur {\npre.Left = child\n} else {\npre.Right = child\n}\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nbst.root = child\n}\n// \u5b50\u8282\u70b9\u6570\u4e3a 2\n} else {\n// \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\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 (cur != root) {\nif (pre.left === cur) pre.left = child;\nelse pre.right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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.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 (cur != root) {\nif (pre!.left === cur) {\npre!.left = child;\n} else {\npre!.right = child;\n}\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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// \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 || pre == 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 (cur != root) {\nif (pre.left == cur)\npre.left = child;\nelse\npre.right = child;\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = 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\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.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 cur != root {\nif pre?.left === cur {\npre?.left = child\n} else {\npre?.right = child\n}\n} else {\n// \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\nroot = cur;\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\nvar 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/#742","title":"7.4.2. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387","text":"

    \u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528\u6570\u7ec4\u6216\u4e8c\u53c9\u641c\u7d22\u6811\u5b58\u50a8\u3002

    \u89c2\u5bdf\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/#743","title":"7.4.3. \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u5e38\u89c1\u5e94\u7528","text":"
    • \u7528\u4f5c\u7cfb\u7edf\u4e2d\u7684\u591a\u7ea7\u7d22\u5f15\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u67e5\u627e\u3001\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u3002
    • \u4f5c\u4e3a\u67d0\u4e9b\u641c\u7d22\u7b97\u6cd5\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002
    • \u7528\u4e8e\u5b58\u50a8\u6570\u636e\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72b6\u6001\u3002
    "},{"location":"chapter_tree/binary_tree/","title":"7.1. \u00a0 \u4e8c\u53c9\u6811","text":"

    \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/#711","title":"7.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/#712","title":"7.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/#713","title":"7.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/#714","title":"7.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":"7.2. \u00a0 \u4e8c\u53c9\u6811\u904d\u5386","text":"

    \u4ece\u7269\u7406\u7ed3\u6784\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6811\u662f\u4e00\u79cd\u57fa\u4e8e\u94fe\u8868\u7684\u6570\u636e\u7ed3\u6784\uff0c\u56e0\u6b64\u5176\u904d\u5386\u65b9\u5f0f\u662f\u901a\u8fc7\u6307\u9488\u9010\u4e2a\u8bbf\u95ee\u8282\u70b9\u3002\u7136\u800c\uff0c\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u8fd9\u4f7f\u5f97\u904d\u5386\u6811\u6bd4\u904d\u5386\u94fe\u8868\u66f4\u52a0\u590d\u6742\uff0c\u9700\u8981\u501f\u52a9\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u3002

    \u4e8c\u53c9\u6811\u5e38\u89c1\u7684\u904d\u5386\u65b9\u5f0f\u5305\u62ec\u5c42\u5e8f\u904d\u5386\u3001\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u7b49\u3002

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1. \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

    \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 = []\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));\n// \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\nfree(queue);\nreturn arr;\n}\n
    binary_tree_bfs.cs
    /* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode root) {\n// \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\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) {\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/#722","title":"7.2.2. \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386","text":"

    \u76f8\u5e94\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\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) {\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) {\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) {\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":"7.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 b/sitemap.xml index e99ab0ad4..d2d695cf6 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,312 +2,312 @@ https://www.hello-algo.com/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_appendix/contribution/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_appendix/installation/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_array_and_linkedlist/array/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_array_and_linkedlist/linked_list/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_array_and_linkedlist/list/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_array_and_linkedlist/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_backtracking/backtracking_algorithm/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_backtracking/n_queens_problem/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_backtracking/permutations_problem/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_computational_complexity/performance_evaluation/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_computational_complexity/space_complexity/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_computational_complexity/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_computational_complexity/time_complexity/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_data_structure/basic_data_types/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_data_structure/character_encoding/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_data_structure/classification_of_data_structure/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_data_structure/number_encoding/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_data_structure/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_graph/graph/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_graph/graph_operations/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_graph/graph_traversal/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_graph/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_hashing/hash_collision/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_hashing/hash_map/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_hashing/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_heap/build_heap/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_heap/heap/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_heap/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_introduction/algorithms_are_everywhere/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_introduction/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_introduction/what_is_dsa/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_preface/about_the_book/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_preface/suggestions/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_preface/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_reference/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_searching/binary_search/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_searching/binary_search_edge/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_searching/replace_linear_by_hashing/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_searching/searching_algorithm_revisited/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_searching/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/bubble_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/bucket_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/counting_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/heap_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/insertion_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/merge_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/quick_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/radix_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/selection_sort/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/sorting_algorithm/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_sorting/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_stack_and_queue/deque/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_stack_and_queue/queue/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_stack_and_queue/stack/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_stack_and_queue/summary/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_tree/avl_tree/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_tree/binary_search_tree/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_tree/binary_tree/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_tree/binary_tree_traversal/ - 2023-05-31 + 2023-06-01 daily https://www.hello-algo.com/chapter_tree/summary/ - 2023-05-31 + 2023-06-01 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index a4e29cb922b5b50f92c1aacb49888523087d800a..28b81c93d19a9098792585ab98cd67ee58c52c57 100644 GIT binary patch literal 743 zcmVQmt{{hepl*zKCjUc3}(c2Or1j8a|6{)s5a|w%iX61 zUuA%)R~D~U*zTS;&!1PDFRRTHce%+Py4l`@ z4)zI-yVf{=-Kq!41fuRF|H#B6jRZ-XafHyii?T6La!n?lIvK<+AQ|t?{E1UCS8YP8 zy$c6uy+cw}C=Yw8>RJ~FFOeGaFqkxNTWO3vP~sbVTJ_k_rE7B34|4c}K4yS`dQ7qL zAc%Z~G-RqCQ3gHN#~ZNmwdLXB=vp+{$26E=LBq-TJbyR;p)NQY*5W}RQwsrZ=tFpN zgP1qa8ZsIwWlK2$dsB3F64G@9l*G7mdJ8!)6w_!$QzYy%aT?2wiwl2es3p}Mafkb8v zZ6{^26O6v>dwCaFrkm?M8j`_(uf1(yv%#NSISy>4=pev}U`$jEJvWVq+7!ZT4?uEw zZOoxmMSd_`| zr&fMMIA+M8THsO?@pP9&T-&mU1z0jAfazx|j@~)BMhJ92&#MpTPk-`4NZ%)`qL{_O Z3ONj`*#FH@)B=HazX6rZ1*i)w008|qT-yKu literal 743 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 literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_dynamic_programming.jpg b/assets/covers/chapter_dynamic_programming.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19eca408400d401ffe62d3da8c3e99023917ad28 GIT binary patch literal 71181 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 M3qd59NdQ0p+2SARO#lD@ literal 0 HcmV?d00001 diff --git a/assets/covers/chapter_hash_map.jpg b/assets/covers/chapter_hash_map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5fa7a467bff3a468fab490d62c49ca4ed2d3465 GIT binary patch literal 139716 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