<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://delluna.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://delluna.github.io/" rel="alternate" type="text/html" /><updated>2026-04-04T05:16:10+00:00</updated><id>https://delluna.github.io/feed.xml</id><title type="html">Delluna / 个人主页</title><subtitle>Delluna&apos;s academic portfolio</subtitle><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><entry><title type="html">Future Blog Post</title><link href="https://delluna.github.io/posts/2012/08/blog-post-4/" rel="alternate" type="text/html" title="Future Blog Post" /><published>2199-01-01T00:00:00+00:00</published><updated>2199-01-01T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2012/08/future-post</id><content type="html" xml:base="https://delluna.github.io/posts/2012/08/blog-post-4/"><![CDATA[<p>This post will show up by default. To disable scheduling of future posts, edit <code class="language-plaintext highlighter-rouge">config.yml</code> and set <code class="language-plaintext highlighter-rouge">future: false</code>.</p>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This post will show up by default. To disable scheduling of future posts, edit config.yml and set future: false.]]></summary></entry><entry><title type="html">Pytorch Fundamentals</title><link href="https://delluna.github.io/posts/2026/04/pytorch_fundamentals/" rel="alternate" type="text/html" title="Pytorch Fundamentals" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2026/04/pytorch_fundamentals</id><content type="html" xml:base="https://delluna.github.io/posts/2026/04/pytorch_fundamentals/"><![CDATA[<p>An introduction to PyTorch, covering tensor initialization, operations, indexing, and reshaping.</p>

<h1 id="pytorch-fundamentals-your-first-steps-into-hands-on-deep-learning">PyTorch Fundamentals: Your First Steps into Hands-on Deep Learning</h1>

<p>This notebook, derived from the <a href="https://github.com/analyticalrohit/pytorch_fundamentals">repository</a>, provides an introduction to PyTorch, covering tensor initialization, operations, indexing, and reshaping. Follow along to learn the basics with clear examples and detailed explanations.</p>

<h1 id="table-of-contents">Table of Contents</h1>

<ul>
  <li><a href="#What-are-Tensors?">What are Tensors?</a></li>
  <li><a href="#Tensor-Initialization">Tensor Initialization</a></li>
  <li><a href="#Common-Tensor-Initialization-Methods">Common Tensor Initialization Methods</a></li>
  <li><a href="#Tensor-Type-Conversion">Tensor Type Conversion</a></li>
  <li><a href="#Converting-Between-NumPy-Arrays-and-Tensors">Converting Between NumPy Arrays and Tensors</a></li>
  <li><a href="#Tensor-Mathematics-and-Comparison-Operations">Tensor Mathematics and Comparison Operations</a></li>
  <li><a href="#Matrix-Multiplication-and-Batch-Operations">Matrix Multiplication and Batch Operations</a></li>
  <li><a href="#Broadcasting-and-Other-Useful-Operations">Broadcasting and Other Useful Operations</a></li>
  <li><a href="#Tensor-Indexing">Tensor Indexing</a></li>
  <li><a href="#Tensor-Reshaping">Tensor Reshaping</a></li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="c1"># Ignore warnings
</span><span class="kn">import</span> <span class="nn">warnings</span>
<span class="n">warnings</span><span class="p">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s">'ignore'</span><span class="p">)</span>

<span class="c1"># Print versions
</span><span class="k">print</span><span class="p">(</span><span class="s">"torch version:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">__version__</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"numpy version:"</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="n">__version__</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>torch version: 2.4.0+cu118
numpy version: 1.26.3
</code></pre></div></div>

<h2 id="what-are-tensors">What are Tensors?</h2>

<p>Tensor holds a multi-dimensional array of elements of a single data type which is very similar with numpy’s ndarray. When the dimension is zero, it can be called a scalar. When the dimension is 1, it can be called a vector. When the dimension is 2, it can be called a matrix.</p>

<ul>
  <li>0-dimensional tensor: A single number (scalar).</li>
  <li>1-dimensional tensor: A list of numbers (vector).</li>
  <li>2-dimensional tensor: A table of numbers (matrix).</li>
</ul>

<p>When the dimension is greater than 2, it is usually called a tensor.</p>

<p><img src="data:image/webp;base64,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" alt="Logo" style="width:800px;" /></p>

<p>对tensor的理解：</p>

<blockquote>
  <p>解释：torch.Size([B,T,H,W,D])</p>

  <p>这是一个五维张量，包含了B个四维张量，</p>

  <p>每个四维张量包含了T个三维张量，</p>

  <p>每个三维张量包含了H个二维张量，</p>

  <p>每个二维张量包含了W个一维张量，</p>

  <p>每个一维张量包含了D个元素。</p>
</blockquote>

<h2 id="tensor-initialization">Tensor Initialization</h2>

<p>This code creates a 2×3 PyTorch tensor with float32 data type, assigns it to a specified device (CPU or GPU), and enables gradient tracking for backpropagation.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Check for CUDA availability and set the device
</span><span class="n">device</span> <span class="o">=</span> <span class="s">"cuda"</span> <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="n">is_available</span><span class="p">()</span> <span class="k">else</span> <span class="s">"cpu"</span>

<span class="c1"># Initialize a 2x3 tensor with requires_grad enabled
</span><span class="n">my_tensor</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">,</span> <span class="n">requires_grad</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">my_tensor</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Data type:"</span><span class="p">,</span> <span class="n">my_tensor</span><span class="p">.</span><span class="n">dtype</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Device:"</span><span class="p">,</span> <span class="n">my_tensor</span><span class="p">.</span><span class="n">device</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Dim:"</span><span class="p">,</span> <span class="n">my_tensor</span><span class="p">.</span><span class="n">ndim</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Shape:"</span><span class="p">,</span> <span class="n">my_tensor</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Requires Gradient:"</span><span class="p">,</span> <span class="n">my_tensor</span><span class="p">.</span><span class="n">requires_grad</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tensor([[1., 2., 3.],
        [4., 5., 6.]], device='cuda:0', requires_grad=True)
Data type: torch.float32
Device: cuda:0
Dim: 2
Shape: torch.Size([2, 3])
Requires Gradient: True
</code></pre></div></div>

<h2 id="other-common-tensor-initialization-methods">Other Common Tensor Initialization Methods</h2>

<ul>
  <li><strong>Empty Tensor:</strong> Creates an uninitialized 3×3 tensor (random values).</li>
  <li><strong>Zeros Tensor:</strong> Creates a 3×3 tensor filled with zeros.</li>
  <li><strong>Random Tensor:</strong> Generates a 3×3 tensor with random values between 0 and 1.</li>
  <li><strong>Ones Tensor:</strong> Creates a 3×3 tensor filled with ones.</li>
  <li><strong>Identity Matrix:</strong> Generates a 4×4 identity matrix (diagonal of ones).</li>
  <li><strong>Arange Tensor:</strong> Creates a 1D tensor with values from 0 to 4 (step of 1).</li>
  <li><strong>Linspace Tensor:</strong> Generates 5 evenly spaced values between 0.1 and 1.</li>
  <li><strong>Normal Distributed Tensor:</strong> Fills a tensor with values from a normal (Gaussian) distribution with mean 0 and std 1.</li>
  <li><strong>Uniform Distributed Tensor:</strong> Fills a tensor with values from a uniform distribution between 0 and 1.</li>
  <li><strong>Diagonal Tensor:</strong> Creates a 4×4 diagonal tensor with ones along the diagonal and zeros elsewhere.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Create an empty tensor of size 3x3
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Empty Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor filled with zeros
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Zeros Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor with random values
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Random Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor filled with ones
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Ones Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create an identity matrix
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">eye</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Identity Matrix:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor using arange
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Arange Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor using linspace
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Linspace Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor with values drawn from a normal distribution
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">).</span><span class="n">normal_</span><span class="p">(</span><span class="n">mean</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">std</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Normal Distributed Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a tensor with values drawn from a uniform distribution
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">).</span><span class="n">uniform_</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Uniform Distributed Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Create a diagonal tensor from a tensor of ones
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">diag</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Diagonal Tensor:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Empty Tensor:
 tensor([[0.2450, 0.9899, 0.0546],
        [0.4938, 0.7471, 0.5465],
        [0.0106, 0.3488, 0.2002]])
Zeros Tensor:
 tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
Random Tensor:
 tensor([[0.1397, 0.6464, 0.0529],
        [0.5808, 0.0736, 0.0454],
        [0.7504, 0.4951, 0.9513]])
Ones Tensor:
 tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
Identity Matrix:
 tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])
Arange Tensor:
 tensor([0, 1, 2, 3, 4])
Linspace Tensor:
 tensor([0.1000, 0.3250, 0.5500, 0.7750, 1.0000])
Normal Distributed Tensor:
 tensor([[-1.2343, -0.4473,  0.6663,  0.0808,  0.3924]])
Uniform Distributed Tensor:
 tensor([[0.4357, 0.9985, 0.8195, 0.4854, 0.3971]])
Diagonal Tensor:
 tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])
</code></pre></div></div>

<h2 id="tensor-type-conversion">Tensor Type Conversion</h2>

<p>Creates a tensor with values [0, 1, 2, 3] and demonstrates type conversion to boolean, int16, int64, float16, float32, and float64.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Create a tensor and convert its type
</span><span class="n">tensor</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Boolean Tensor:"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">.</span><span class="nb">bool</span><span class="p">())</span>   <span class="c1"># Convert to boolean
</span><span class="k">print</span><span class="p">(</span><span class="s">"Short Tensor (int16):"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">.</span><span class="n">short</span><span class="p">())</span>   <span class="c1"># Convert to int16
</span><span class="k">print</span><span class="p">(</span><span class="s">"Long Tensor (int64):"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">.</span><span class="nb">long</span><span class="p">())</span>   <span class="c1"># Convert to int64
</span><span class="k">print</span><span class="p">(</span><span class="s">"Half Tensor (float16):"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">.</span><span class="n">half</span><span class="p">())</span>   <span class="c1"># Convert to float16
</span><span class="k">print</span><span class="p">(</span><span class="s">"Float Tensor (float32):"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">.</span><span class="nb">float</span><span class="p">())</span>   <span class="c1"># Convert to float32
</span><span class="k">print</span><span class="p">(</span><span class="s">"Double Tensor (float64):"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">.</span><span class="n">double</span><span class="p">())</span>   <span class="c1"># Convert to float64
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Boolean Tensor: tensor([False,  True,  True,  True])
Short Tensor (int16): tensor([0, 1, 2, 3], dtype=torch.int16)
Long Tensor (int64): tensor([0, 1, 2, 3])
Half Tensor (float16): tensor([0., 1., 2., 3.], dtype=torch.float16)
Float Tensor (float32): tensor([0., 1., 2., 3.])
Double Tensor (float64): tensor([0., 1., 2., 3.], dtype=torch.float64)
</code></pre></div></div>

<h2 id="converting-between-numpy-arrays-and-tensors">Converting Between NumPy Arrays and Tensors</h2>

<p>PyTorch makes it easy to switch between NumPy arrays and tensors, allowing seamless integration with existing computing workflows.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Create a NumPy array of zeros
</span><span class="n">np_array</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">zeros</span><span class="p">((</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"NumPy Array:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">np_array</span><span class="p">)</span>

<span class="c1"># Convert NumPy array to PyTorch tensor
</span><span class="n">tensor</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">from_numpy</span><span class="p">(</span><span class="n">np_array</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tensor from NumPy Array:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">tensor</span><span class="p">)</span>

<span class="c1"># Convert tensor back to NumPy array
</span><span class="n">numpy_back</span> <span class="o">=</span> <span class="n">tensor</span><span class="p">.</span><span class="n">numpy</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Converted Back to NumPy Array:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">numpy_back</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NumPy Array:
 [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
Tensor from NumPy Array:
 tensor([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]], dtype=torch.float64)
Converted Back to NumPy Array:
 [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
</code></pre></div></div>

<h2 id="tensor-mathematics-and-comparison-operations">Tensor Mathematics and Comparison Operations</h2>

<p>This section explores essential math operations with PyTorch tensors.</p>

<ul>
  <li><strong>Addition &amp; Subtraction:</strong> Adds and subtracts two tensors element-wise.</li>
  <li><strong>Division:</strong> Uses true division for precise results.</li>
  <li><strong>Inplace Operations:</strong> Modifies a tensor directly without creating a new one.</li>
  <li><strong>Exponentiation:</strong> Raises each element to a power using <code class="language-plaintext highlighter-rouge">pow()</code> or <code class="language-plaintext highlighter-rouge">**</code>.</li>
  <li><strong>Comparisons:</strong> Checks conditions like <code class="language-plaintext highlighter-rouge">x &gt; 0</code> or <code class="language-plaintext highlighter-rouge">x &lt; 0</code>, returning boolean results.</li>
  <li><strong>Dot Product:</strong> Computes the sum of element-wise multiplications between two tensors.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Define two tensors for operations
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([</span><span class="mi">9</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">7</span><span class="p">])</span>

<span class="c1"># Addition
</span><span class="n">z</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Addition Results:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Addition using .add
</span><span class="n">z1</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="n">torch</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">out</span><span class="o">=</span><span class="n">z1</span><span class="p">)</span>
<span class="n">z2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Addition Results:"</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">z1</span><span class="p">,</span> <span class="n">z2</span><span class="p">)</span>

<span class="c1"># Subtraction
</span><span class="n">z</span> <span class="o">=</span> <span class="n">x</span> <span class="o">-</span> <span class="n">y</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Subtraction Result:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Division (true division)
</span><span class="n">z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">true_divide</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Division Result:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Inplace operations
</span><span class="n">t</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Before inplace addition:"</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
<span class="n">t</span><span class="p">.</span><span class="n">add_</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"After inplace addition:"</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
<span class="n">t</span> <span class="o">+=</span> <span class="n">x</span>  <span class="c1"># Another inplace addition (note: t = t + x creates a new tensor)
</span><span class="k">print</span><span class="p">(</span><span class="s">"After second inplace addition:"</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>

<span class="c1"># Exponentiation
</span><span class="n">z</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Exponentiation (pow):"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Exponentiation (**):"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Comparisons
</span><span class="n">z</span> <span class="o">=</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span>
<span class="k">print</span><span class="p">(</span><span class="s">"x &gt; 0:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">0</span>
<span class="k">print</span><span class="p">(</span><span class="s">"x &lt; 0:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Dot product
</span><span class="n">z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">dot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Dot Product:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Addition Results: tensor([10, 10, 10])
Addition Results: tensor([10, 10, 10]) tensor([10., 10., 10.]) tensor([10, 10, 10])
Subtraction Result: tensor([-8, -6, -4])
Division Result: tensor([0.1111, 0.2500, 0.4286])
Before inplace addition: tensor([1., 1., 1.])
After inplace addition: tensor([2., 3., 4.])
After second inplace addition: tensor([3., 5., 7.])
Exponentiation (pow): tensor([1, 4, 9])
Exponentiation (**): tensor([1, 4, 9])
x &gt; 0: tensor([True, True, True])
x &lt; 0: tensor([False, False, False])
Dot Product: tensor(46)
</code></pre></div></div>

<h2 id="matrix-multiplication-and-batch-operations">Matrix Multiplication and Batch Operations</h2>

<p>Matrix operations are at the heart of deep learning. Let’s find out different ways to perform multiplication.</p>

<ul>
  <li><strong>Matrix Multiplication:</strong> Uses <code class="language-plaintext highlighter-rouge">@</code> or <code class="language-plaintext highlighter-rouge">torch.mm()</code> to perform standard matrix multiplication.</li>
  <li><strong>Matrix Exponentiation:</strong> Raises a square matrix to a power using <code class="language-plaintext highlighter-rouge">matrix_power(n)</code>.</li>
  <li><strong>Element-wise Multiplication:</strong> Uses <code class="language-plaintext highlighter-rouge">torch.mul()</code> or <code class="language-plaintext highlighter-rouge">*</code> for element-wise multiplication.</li>
  <li><strong>Batch Matrix Multiplication:</strong> Uses <code class="language-plaintext highlighter-rouge">torch.bmm()</code> to multiply batches of matrices efficiently.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Matrix multiplication using @ operator and torch.mm
</span><span class="n">x2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]])</span>
<span class="n">y2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([[</span><span class="mi">9</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">7</span><span class="p">]])</span>

<span class="n">z</span> <span class="o">=</span> <span class="n">x2</span> <span class="o">@</span> <span class="n">torch</span><span class="p">.</span><span class="n">t</span><span class="p">(</span><span class="n">y2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Matrix Multiplication (@ operator):</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">mm</span><span class="p">(</span><span class="n">x2</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">t</span><span class="p">(</span><span class="n">y2</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Matrix Multiplication (torch.mm):</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">x2</span><span class="p">.</span><span class="n">mm</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">t</span><span class="p">(</span><span class="n">y2</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Matrix Multiplication (mm):</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Matrix exponentiation: multiplying a matrix with itself 3 times
</span><span class="n">matrix_exp</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Matrix multiplied 3 times:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">matrix_exp</span> <span class="o">@</span> <span class="n">matrix_exp</span> <span class="o">@</span> <span class="n">matrix_exp</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Matrix power 3:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">matrix_exp</span><span class="p">.</span><span class="n">matrix_power</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>

<span class="c1"># Element-wise multiplication
</span><span class="n">z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">mul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Element-wise Multiplication:"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Element-wise Multiplication (alternative):"</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>

<span class="c1"># Batch matrix multiplication
</span><span class="n">batch</span> <span class="o">=</span> <span class="mi">32</span>
<span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span>
<span class="n">tensor1</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">((</span><span class="n">batch</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">))</span>
<span class="n">tensor2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">((</span><span class="n">batch</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">p</span><span class="p">))</span>
<span class="n">out_bmm</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">bmm</span><span class="p">(</span><span class="n">tensor1</span><span class="p">,</span> <span class="n">tensor2</span><span class="p">)</span>  <span class="c1"># Result shape: (batch, n, p)
</span><span class="k">print</span><span class="p">(</span><span class="s">"Batch Matrix Multiplication (first batch):</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">out_bmm</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Shape of batched multiplication result:"</span><span class="p">,</span> <span class="p">(</span><span class="n">tensor1</span> <span class="o">@</span> <span class="n">tensor2</span><span class="p">).</span><span class="n">shape</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Matrix Multiplication (@ operator):
 tensor([[46]])
Matrix Multiplication (torch.mm):
 tensor([[46]])
Matrix Multiplication (mm):
 tensor([[46]])
Matrix multiplied 3 times:
 tensor([[6.8649, 7.1375, 6.5783, 7.6163, 6.8593],
        [6.4644, 6.5831, 6.2444, 7.0148, 6.4003],
        [5.8586, 6.0872, 5.5466, 6.2068, 5.5633],
        [6.6579, 6.8326, 6.3734, 7.4843, 6.8450],
        [5.6023, 5.7104, 5.4097, 5.7048, 5.1312]])
Matrix power 3:
 tensor([[6.8649, 7.1375, 6.5783, 7.6163, 6.8593],
        [6.4644, 6.5831, 6.2444, 7.0148, 6.4003],
        [5.8586, 6.0872, 5.5466, 6.2068, 5.5633],
        [6.6579, 6.8326, 6.3734, 7.4843, 6.8450],
        [5.6023, 5.7104, 5.4097, 5.7048, 5.1312]])
Element-wise Multiplication: tensor([ 9, 16, 21])
Element-wise Multiplication (alternative): tensor([ 9, 16, 21])
Batch Matrix Multiplication (first batch):
 tensor([[3.5440, 6.5026, 6.5445, 4.5252, 5.2045, 5.7321, 6.1181, 6.6445, 6.0093,
         4.9353, 3.9677, 4.6019, 6.3319, 5.7043, 5.1247, 4.3091, 4.7326, 4.8858,
         5.1322, 5.6088, 5.9398, 6.9429, 5.9886, 5.2573, 2.7003, 4.8218, 5.9894,
         4.6512, 5.1542, 3.7731],
        [4.2282, 5.0751, 4.5581, 3.9363, 5.2671, 5.2506, 4.4924, 5.5095, 5.1781,
         3.7145, 4.7497, 3.8810, 4.2245, 4.6506, 4.5174, 2.8565, 3.9761, 3.8779,
         4.3638, 4.0318, 5.5015, 3.9265, 5.3370, 4.7982, 2.2797, 4.3291, 3.7386,
         4.0959, 3.6940, 3.2689],
        [4.5827, 6.1946, 4.9569, 4.6735, 5.6490, 5.8873, 5.7623, 6.4767, 6.3909,
         4.4470, 5.0609, 4.6619, 5.1481, 5.3259, 5.4949, 3.7388, 5.1354, 4.2429,
         4.5741, 4.5234, 5.5854, 4.6225, 5.9995, 5.5425, 2.8380, 4.2748, 4.3472,
         4.4736, 4.1825, 3.4843],
        [3.3100, 5.1634, 5.0415, 3.7873, 4.4239, 5.4084, 5.0781, 5.1528, 5.1801,
         3.5463, 3.6643, 3.9544, 4.7713, 4.8103, 3.8891, 2.8634, 4.0375, 3.4439,
         4.1778, 4.0538, 4.9986, 4.8988, 5.2553, 4.8321, 1.6977, 4.3844, 4.1179,
         4.2077, 4.1596, 3.0347],
        [4.1352, 5.5097, 5.4081, 4.1339, 5.2045, 5.8074, 5.9689, 5.7145, 5.1557,
         4.5157, 4.7473, 5.3542, 5.0027, 4.4979, 5.2767, 4.4354, 3.5934, 4.7134,
         5.1901, 5.5433, 6.2373, 4.5942, 5.5256, 5.3336, 3.2117, 4.1416, 4.2712,
         4.1048, 4.0465, 3.6511],
        [3.7322, 5.3081, 5.4181, 4.6393, 5.1372, 5.5894, 5.5543, 6.0296, 4.5670,
         4.0552, 4.2119, 4.5391, 5.2059, 4.8795, 5.0137, 3.7978, 3.7304, 4.0530,
         4.3719, 5.0318, 5.7526, 4.8653, 4.8926, 5.5795, 2.6404, 4.2889, 4.5551,
         4.2022, 3.9910, 3.8555],
        [3.2315, 4.6632, 4.9304, 3.5092, 4.4533, 4.8799, 4.6290, 5.3459, 4.9640,
         3.7996, 4.0911, 4.0296, 4.6814, 4.0135, 4.5876, 3.6069, 3.8043, 4.2701,
         4.1166, 4.8829, 5.5559, 4.8536, 4.5921, 3.6704, 2.4689, 3.4953, 3.6832,
         3.9577, 3.5755, 3.0293],
        [4.7066, 5.7029, 6.1439, 4.4224, 5.7423, 6.4657, 5.8944, 5.8826, 6.2143,
         4.1787, 4.8364, 4.9471, 5.2735, 4.8664, 5.5245, 3.1057, 4.8749, 4.4022,
         5.6390, 5.2407, 6.2896, 5.6143, 5.5157, 5.6265, 2.1874, 4.4567, 3.9869,
         5.5333, 4.4775, 3.9314],
        [4.3227, 5.8580, 5.9357, 4.1483, 5.2436, 6.3560, 5.7144, 5.9563, 5.8249,
         4.5020, 4.4281, 4.4165, 5.4092, 4.8056, 4.9667, 4.0844, 4.2222, 3.8133,
         4.5904, 5.0534, 6.7042, 5.0727, 5.5185, 5.6069, 3.0032, 4.5262, 4.0067,
         4.7430, 4.2932, 3.7362],
        [3.8294, 5.4057, 5.0970, 3.9448, 5.0699, 5.1357, 4.9649, 5.2615, 4.4683,
         3.5833, 4.0856, 3.3753, 4.0069, 4.1184, 4.2750, 3.4178, 3.7880, 3.3670,
         4.7347, 4.6245, 5.3556, 3.9735, 5.1346, 5.1036, 2.6921, 4.2103, 3.9386,
         3.6596, 4.1051, 2.2051]])
Shape of batched multiplication result: torch.Size([32, 10, 30])
</code></pre></div></div>

<h2 id="broadcasting-and-other-useful-operations">Broadcasting and Other Useful Operations</h2>

<p>Broadcasting allows arithmetic operations on tensors of different shapes. This section also demonstrates additional useful functions.</p>

<ul>
  <li><strong>Broadcasting:</strong> Automatically expands smaller tensors to match larger ones in operations.</li>
  <li><strong>Summation:</strong> <code class="language-plaintext highlighter-rouge">torch.sum(x, dim=0)</code> computes sum along a specific dimension.</li>
  <li><strong>Min/Max Values:</strong> <code class="language-plaintext highlighter-rouge">torch.max()</code> and <code class="language-plaintext highlighter-rouge">torch.min()</code> return the highest and lowest values along a dimension.</li>
  <li><strong>Absolute Values:</strong> <code class="language-plaintext highlighter-rouge">torch.abs(x)</code> gets the element-wise absolute values.</li>
  <li><strong>Argmax/Argmin:</strong> <code class="language-plaintext highlighter-rouge">torch.argmax()</code> and <code class="language-plaintext highlighter-rouge">torch.argmin()</code> return the index of max/min values.</li>
  <li><strong>Mean Calculation:</strong> <code class="language-plaintext highlighter-rouge">torch.mean(x.float(), dim=0)</code> computes the mean (ensuring float dtype).</li>
  <li><strong>Element-wise Comparison:</strong> <code class="language-plaintext highlighter-rouge">torch.eq(x, y)</code> checks equality between two tensors.</li>
  <li><strong>Sorting:</strong> <code class="language-plaintext highlighter-rouge">torch.sort(y, dim=0)</code> sorts tensor elements and returns indices.</li>
  <li><strong>Clamping:</strong> <code class="language-plaintext highlighter-rouge">torch.clamp(x, min=0)</code> restricts values within a range.</li>
  <li><strong>Boolean Operations:</strong> <code class="language-plaintext highlighter-rouge">torch.any(x_bool)</code> checks if any value is <code class="language-plaintext highlighter-rouge">True</code>, <code class="language-plaintext highlighter-rouge">torch.all(x_bool)</code> checks if all are <code class="language-plaintext highlighter-rouge">True</code>.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Broadcasting example
</span><span class="n">x1</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="n">x2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tensor x1:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tensor x2:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"x1 - x2:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x1</span> <span class="o">-</span> <span class="n">x2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"x1 raised to the power of x2:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x1</span> <span class="o">**</span> <span class="n">x2</span><span class="p">)</span>

<span class="c1"># Sum of tensor elements along dimension 0
</span><span class="n">sum_x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nb">sum</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Sum along dimension 0:"</span><span class="p">,</span> <span class="n">sum_x</span><span class="p">)</span>

<span class="c1"># Maximum and minimum values
</span><span class="n">value</span><span class="p">,</span> <span class="n">indices</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Max value and index:"</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">indices</span><span class="p">)</span>

<span class="n">value</span><span class="p">,</span> <span class="n">indices</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nb">min</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Min value and index:"</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">indices</span><span class="p">)</span>

<span class="c1"># Other operations
</span><span class="k">print</span><span class="p">(</span><span class="s">"Absolute values:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Argmax:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Argmin:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">argmin</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Mean (converted to float):"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">mean</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nb">float</span><span class="p">(),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Element-wise equality (x == y):"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">eq</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>

<span class="c1"># Sorting
</span><span class="n">sorted_y</span><span class="p">,</span> <span class="n">indices</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">sort</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">descending</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Sorted y and indices:"</span><span class="p">,</span> <span class="n">sorted_y</span><span class="p">,</span> <span class="n">indices</span><span class="p">)</span>

<span class="c1"># Clamping values
</span><span class="k">print</span><span class="p">(</span><span class="s">"Clamped x:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">clamp</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>

<span class="c1"># Boolean operations
</span><span class="n">x_bool</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="nb">bool</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Any True:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="nb">any</span><span class="p">(</span><span class="n">x_bool</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"All True:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="nb">all</span><span class="p">(</span><span class="n">x_bool</span><span class="p">))</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Tensor x1:
 tensor([[0.5610, 0.6928, 0.8066, 0.2603, 0.1528],
        [0.9867, 0.1102, 0.4665, 0.1929, 0.6669],
        [0.4671, 0.0768, 0.6585, 0.5024, 0.8904],
        [0.6634, 0.6646, 0.0860, 0.1698, 0.0833],
        [0.5990, 0.0964, 0.4688, 0.3539, 0.0450]])
Tensor x2:
 tensor([0.8125, 0.2102, 0.6983, 0.5526, 0.1509])
x1 - x2:
 tensor([[-0.2516,  0.4826,  0.1083, -0.2923,  0.0019],
        [ 0.1741, -0.1000, -0.2318, -0.3597,  0.5160],
        [-0.3454, -0.1334, -0.0397, -0.0503,  0.7396],
        [-0.1491,  0.4544, -0.6123, -0.3828, -0.0676],
        [-0.2135, -0.1138, -0.2294, -0.1988, -0.1058]])
x1 raised to the power of x2:
 tensor([[0.6252, 0.9258, 0.8606, 0.4753, 0.7532],
        [0.9892, 0.6290, 0.5872, 0.4028, 0.9407],
        [0.5388, 0.5831, 0.7470, 0.6836, 0.9826],
        [0.7164, 0.9177, 0.1803, 0.3754, 0.6873],
        [0.6594, 0.6116, 0.5892, 0.5632, 0.6264]])
Sum along dimension 0: tensor(6)
Max value and index: tensor(3) tensor(2)
Min value and index: tensor(1) tensor(0)
Absolute values: tensor([1, 2, 3])
Argmax: tensor(2)
Argmin: tensor(0)
Mean (converted to float): tensor(2.)
Element-wise equality (x == y): tensor([False, False, False])
Sorted y and indices: tensor([7, 8, 9]) tensor([2, 1, 0])
Clamped x: tensor([1, 2, 3])
Any True: tensor(True)
All True: tensor(False)
</code></pre></div></div>

<h2 id="tensor-indexing">Tensor Indexing</h2>

<p>Access and modify tensor elements using indexing, slicing, and advanced indexing.</p>

<ul>
  <li><strong>Accessing Rows &amp; Columns:</strong> Use <code class="language-plaintext highlighter-rouge">x[row, :]</code> for a row and <code class="language-plaintext highlighter-rouge">x[:, col]</code> for a column.</li>
  <li><strong>Slicing:</strong> <code class="language-plaintext highlighter-rouge">x[row, start:end]</code> extracts a portion of a row.</li>
  <li><strong>Modifying Elements:</strong> Directly assign values using <code class="language-plaintext highlighter-rouge">x[row, col] = value</code>.</li>
  <li><strong>Fancy Indexing:</strong> Use a list of indices to select multiple elements at once.</li>
  <li><strong>Conditional Indexing:</strong> Extract elements using conditions like <code class="language-plaintext highlighter-rouge">(x &lt; 2) | (x &gt; 8)</code>.</li>
  <li><strong>Finding Even Numbers:</strong> Use <code class="language-plaintext highlighter-rouge">x.remainder(2) == 0</code> to filter even values.</li>
  <li><strong>Conditional Selection with <code class="language-plaintext highlighter-rouge">torch.where()</code>:</strong> Chooses values based on a condition.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Create a random tensor with shape (batch_size, features)
</span><span class="n">batch_size</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">features</span> <span class="o">=</span> <span class="mi">25</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">((</span><span class="n">batch_size</span><span class="p">,</span> <span class="n">features</span><span class="p">))</span>

<span class="c1"># Access the first row
</span><span class="k">print</span><span class="p">(</span><span class="s">"First row of tensor:"</span><span class="p">,</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="p">:])</span>

<span class="c1"># Access the second column
</span><span class="k">print</span><span class="p">(</span><span class="s">"Second column of tensor:"</span><span class="p">,</span> <span class="n">x</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">])</span>

<span class="c1"># Access the first 10 elements of the third row
</span><span class="k">print</span><span class="p">(</span><span class="s">"First 10 elements of third row:"</span><span class="p">,</span> <span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">:</span><span class="mi">10</span><span class="p">])</span>

<span class="c1"># Modify a specific element (set first element to 100)
</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">100</span>

<span class="c1"># Fancy indexing example
</span><span class="n">x1</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Fancy indexing result:"</span><span class="p">,</span> <span class="n">x1</span><span class="p">[</span><span class="n">indices</span><span class="p">])</span>

<span class="c1"># Advanced indexing: select elements based on a condition
</span><span class="n">x2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Elements where x2 &lt; 2 or x2 &gt; 8:"</span><span class="p">,</span> <span class="n">x2</span><span class="p">[(</span><span class="n">x2</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">x2</span> <span class="o">&gt;</span> <span class="mi">8</span><span class="p">)])</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Even numbers in x2:"</span><span class="p">,</span> <span class="n">x2</span><span class="p">[</span><span class="n">x2</span><span class="p">.</span><span class="n">remainder</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">])</span>

<span class="c1"># Using torch.where to select values based on a condition
</span><span class="s">'''
torch.where(condition, x, y)
- condition：布尔型张量，决定从 x 或 y 中选择元素
- x：condition 为 True 时选择的值，支持张量或标量
- y：condition 为 False 时选择的值，支持张量或标量
'''</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Using torch.where:"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">where</span><span class="p">(</span><span class="n">x2</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">x2</span> <span class="o">*</span> <span class="mi">2</span><span class="p">))</span>


</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>First row of tensor: tensor([0.1933, 0.0269, 0.3945, 0.6182, 0.3705, 0.7060, 0.4922, 0.0280, 0.3398,
        0.9600, 0.2417, 0.8861, 0.1833, 0.0985, 0.2710, 0.6410, 0.3799, 0.5981,
        0.0205, 0.9136, 0.9481, 0.6899, 0.9450, 0.6970, 0.1787])
Second column of tensor: tensor([2.6887e-02, 8.1319e-02, 9.8993e-01, 4.5033e-01, 5.7220e-04, 9.5527e-01,
        1.1555e-01, 9.4050e-02, 5.3863e-02, 5.0582e-01])
First 10 elements of third row: tensor([0.2450, 0.9899, 0.0546, 0.4938, 0.7471, 0.5465, 0.0106, 0.3488, 0.2002,
        0.4488])
Fancy indexing result: tensor([2, 5, 8])
Elements where x2 &lt; 2 or x2 &gt; 8: tensor([0, 1, 9])
Even numbers in x2: tensor([0, 2, 4, 6, 8])
Using torch.where: tensor([ 0,  2,  4,  6,  8, 10,  6,  7,  8,  9])
</code></pre></div></div>

<h2 id="tensor-reshaping">Tensor Reshaping</h2>

<p>Learn how to reshape tensors, concatenate them, and change the order of dimensions.</p>

<ul>
  <li><strong>Reshape with <code class="language-plaintext highlighter-rouge">view()</code> &amp; <code class="language-plaintext highlighter-rouge">reshape()</code>:</strong> Change tensor shape without altering data.</li>
  <li><strong>Transpose &amp; Flatten:</strong> <code class="language-plaintext highlighter-rouge">.t()</code> transposes, <code class="language-plaintext highlighter-rouge">.contiguous().view(-1)</code> flattens.</li>
  <li><strong>Concatenation:</strong> <code class="language-plaintext highlighter-rouge">torch.cat([x1, x2], dim=0/1)</code> merges tensors along rows/columns.</li>
  <li><strong>Flattening:</strong> <code class="language-plaintext highlighter-rouge">.view(-1)</code> converts a tensor into a 1D array.</li>
  <li><strong>Batch Reshaping:</strong> <code class="language-plaintext highlighter-rouge">.view(batch, -1)</code> keeps batch size while reshaping.</li>
  <li><strong>Permute Dimensions:</strong> <code class="language-plaintext highlighter-rouge">.permute(0, 2, 1)</code> reorders dimensions efficiently.</li>
  <li><strong>Unsqueeze for New Dimensions:</strong> <code class="language-plaintext highlighter-rouge">.unsqueeze(dim)</code> adds singleton dimensions.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Reshape a tensor using view and reshape
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">9</span><span class="p">)</span>
<span class="n">x_3x3</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="n">view</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Reshaped to 3x3 using view:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x_3x3</span><span class="p">)</span>
<span class="n">x_3x3</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Reshaped to 3x3 using reshape:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x_3x3</span><span class="p">)</span>

<span class="c1"># Transpose and flatten the tensor
</span><span class="n">y</span> <span class="o">=</span> <span class="n">x_3x3</span><span class="p">.</span><span class="n">t</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Flattened transposed tensor:"</span><span class="p">,</span> <span class="n">y</span><span class="p">.</span><span class="n">contiguous</span><span class="p">().</span><span class="n">view</span><span class="p">(</span><span class="mi">9</span><span class="p">))</span>

<span class="c1"># Concatenation example
</span><span class="n">x1</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="n">x2</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Concatenated along dimension 0 (rows):"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">cat</span><span class="p">([</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">],</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">).</span><span class="n">shape</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Concatenated along dimension 1 (columns):"</span><span class="p">,</span> <span class="n">torch</span><span class="p">.</span><span class="n">cat</span><span class="p">([</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">],</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">shape</span><span class="p">)</span>

<span class="c1"># Flatten the tensor using view(-1)
</span><span class="n">z</span> <span class="o">=</span> <span class="n">x1</span><span class="p">.</span><span class="n">view</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Flattened tensor shape:"</span><span class="p">,</span> <span class="n">z</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>

<span class="c1"># Reshape with batch dimension
</span><span class="n">batch</span> <span class="o">=</span> <span class="mi">64</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">rand</span><span class="p">(</span><span class="n">batch</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Reshaped to (batch, -1):"</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="n">view</span><span class="p">(</span><span class="n">batch</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">).</span><span class="n">shape</span><span class="p">)</span>

<span class="c1"># Permute dimensions
</span><span class="n">z</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="n">permute</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Permuted tensor shape:"</span><span class="p">,</span> <span class="n">z</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>

<span class="c1"># Unsqueeze examples (adding new dimensions)
</span><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Original x:"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"x unsqueezed at dim 0:"</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="n">shape</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"x unsqueezed at dim 1:"</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">shape</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Reshaped to 3x3 using view:
 tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
Reshaped to 3x3 using reshape:
 tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
Flattened transposed tensor: tensor([0, 3, 6, 1, 4, 7, 2, 5, 8])
Concatenated along dimension 0 (rows): torch.Size([4, 5])
Concatenated along dimension 1 (columns): torch.Size([2, 10])
Flattened tensor shape: torch.Size([10])
Reshaped to (batch, -1): torch.Size([64, 10])
Permuted tensor shape: torch.Size([64, 5, 2])
Original x: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x unsqueezed at dim 0: torch.Size([1, 10]) tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
x unsqueezed at dim 1: torch.Size([10, 1]) tensor([[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]])
</code></pre></div></div>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="pytorch" /><summary type="html"><![CDATA[An introduction to PyTorch, covering tensor initialization, operations, indexing, and reshaping.]]></summary></entry><entry><title type="html">Git使用指南</title><link href="https://delluna.github.io/posts/2026/03/Git/" rel="alternate" type="text/html" title="Git使用指南" /><published>2026-03-17T00:00:00+00:00</published><updated>2026-03-17T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2026/03/Git</id><content type="html" xml:base="https://delluna.github.io/posts/2026/03/Git/"><![CDATA[<p>Git使用指南</p>

<h1 id="git使用指南">Git使用指南</h1>

<ul>
  <li><a href="#git使用指南">Git使用指南</a>
    <ul>
      <li><a href="#1-介绍">1. 介绍</a>
        <ul>
          <li><a href="#11-基本信息">1.1 基本信息</a></li>
          <li><a href="#12-核心特性">1.2 核心特性</a></li>
          <li><a href="#13-工作方式">1.3 工作方式</a></li>
          <li><a href="#14-Git原理">1.4 Git原理</a></li>
        </ul>
      </li>
      <li><a href="#2-常用命令">2. 常用命令</a>
        <ul>
          <li><a href="#21-本地操作">2.1 本地操作</a></li>
          <li><a href="#22-远程操作">2.2 远程操作</a></li>
          <li><a href="#23-git分支模型">2.3 Git分支模型</a></li>
          <li><a href="#24-代理">2.4 代理</a></li>
        </ul>
      </li>
      <li><a href="#3-场景示例">3. 场景示例</a>
        <ul>
          <li><a href="#31-本地项目首次推送到远程仓库初始化流程">3.1 本地项目首次推送到远程仓库（初始化流程）</a></li>
          <li><a href="#32-从远程仓库克隆项目到本地">3.2 从远程仓库克隆项目到本地</a></li>
          <li><a href="#33-本地修改提交并推送到远程仓库">3.3 本地修改提交并推送到远程仓库</a></li>
          <li><a href="#34-从远程仓库拉取更新到本地">3.4 从远程仓库拉取更新到本地</a></li>
          <li><a href="#35-将当前main分支的代码保存一份到新的v0分支">3.5 将当前main分支的代码保存一份到新的v0分支</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="1-介绍">1. 介绍</h2>

<h3 id="11-基本信息">1.1 基本信息</h3>

<ul>
  <li>
    <p>Git（读音为/gɪt/） 是一款开源的‌<strong>分布式版本控制系统</strong>‌，由 Linux 之父 Linus Torvalds 于 2005 年创建，最初用于管理 Linux 内核源码。</p>
  </li>
  <li>Git 的核心作用是<strong>记录文件的变化历史</strong>，使开发者可以：
    <ul>
      <li>追踪代码的每一次修改</li>
      <li>回滚到任意历史版本</li>
      <li>支持多人协作开发</li>
    </ul>
  </li>
  <li>
    <p>与传统的集中式版本控制系统（如 SVN）不同，Git 采用分布式架构，每个开发者本地都拥有完整的代码仓库和历史记录，因此可以在离线状态下完成大部分操作。</p>
  </li>
  <li>
    <p>目前 Git 已成为软件开发领域的事实标准，广泛应用于各类项目管理与协作开发中。</p>
  </li>
  <li>👉 官方网站：https://git-scm.com/</li>
</ul>

<h3 id="12-核心特性">1.2 核心特性</h3>

<ol>
  <li><strong>分布式架构</strong>
 每个开发者都拥有完整仓库副本，可离线工作，提高可靠性并避免单点故障。</li>
  <li><strong>高性能</strong>
 本地操作（如提交、查看历史）速度极快，适合大型项目。</li>
  <li><strong>数据完整性</strong>
 Git 使用哈希（SHA-1）来标识每个版本，确保数据不被篡改。</li>
  <li><strong>强大的分支机制</strong>
 分支创建和切换成本极低，支持并行开发（feature / bugfix / release）。</li>
  <li><strong>良好的协作能力</strong>
 支持多人协作开发，配合 GitHub / GitLab 等平台效果更佳。</li>
  <li><strong>跨平台支持</strong>
 支持 Windows、macOS、Linux。</li>
</ol>

<h3 id="13-工作方式">1.3 工作方式</h3>

<p><img src="../images/git.jpg" alt="Git区的划分" /></p>

<ul>
  <li>workspace: 工作区域，平时存放项目代码的地方。</li>
  <li>Index/Stage：暂存区域，用于临时存放代码改动，事实上只是一个文件，保存即将提交的文件列表信息。</li>
  <li>Repository：Git本地仓库，用于安全存放数据，这里有提交的所有版本的数据。其中，HEAD 指向最新放入仓库的版本。</li>
  <li>Remote：Git远程仓库，如GitHub、Gitee等。</li>
</ul>

<p>Git 管理的文件有三种状态：已修改（modified）、已暂存（staged）和已提交（committed），分别对应workspace、index、repository</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add：工作区 → 暂存区
git commit：暂存区 → 本地仓库
git push：本地仓库 → 远程仓库
</code></pre></div></div>

<h3 id="14-git原理">1.4 Git原理</h3>

<blockquote>
  <p>参考链接：<a href="https://blog.csdn.net/u011487024/article/details/157128397">Git原理解析</a>
参考链接：<a href="https://www.bilibili.com/video/BV1o7XsBaEX1">Git原理解析</a></p>
</blockquote>

<h2 id="2-常用命令">2. 常用命令</h2>

<h3 id="21-本地操作">2.1 本地操作</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">命令</th>
      <th style="text-align: left">功能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">git init</td>
      <td style="text-align: left">初始化仓库</td>
    </tr>
    <tr>
      <td style="text-align: left">git status</td>
      <td style="text-align: left">查看当前仓库状态</td>
    </tr>
    <tr>
      <td style="text-align: left">git log</td>
      <td style="text-align: left">查看提交历史</td>
    </tr>
    <tr>
      <td style="text-align: left">git config</td>
      <td style="text-align: left">配置信息</td>
    </tr>
    <tr>
      <td style="text-align: left">git add .</td>
      <td style="text-align: left">添加所有更改到暂存区</td>
    </tr>
    <tr>
      <td style="text-align: left">git add &lt;file&gt;</td>
      <td style="text-align: left">添加指定文件到暂存区</td>
    </tr>
    <tr>
      <td style="text-align: left">git commit -m “提交描述”</td>
      <td style="text-align: left">将暂存区文件添加到本地仓库</td>
    </tr>
  </tbody>
</table>

<p>通过以下命令，即可创建一个仓库并提交文件：</p>

<p><strong>1. 初始化仓库</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git init
</code></pre></div></div>

<p><strong>2. 配置用户信息（Git 首次安装必须设置一下用户签名，否则无法提交代码。之后无需再次配置）</strong></p>

<pre><code class="language-cmd">git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
</code></pre>

<ul>
  <li>签名的作用是区分不同操作者身份，用户的签名信息在每一个版本的提交信息中能够看到，以此确认本次提交是谁做的。</li>
  <li>这里设置用户签名和将来登录 GitHub（或其他代码托管中心）的账号没有任何关系</li>
</ul>

<p><strong>3. 添加更改到暂存区</strong></p>

<pre><code class="language-cmd">git add &lt;filename&gt;  # 添加指定文件到暂存区
git add .           # 添加所有更改到暂存区
</code></pre>

<p><strong>4. 将暂存区文件提交至仓库</strong></p>

<pre><code class="language-cmd">git commit -m "提交描述" # 提交暂存区的文件快照到本地仓库
</code></pre>

<ul>
  <li>使用命令git add <file>，可反复多次使用，添加多个文件至暂存区；最后在使用命令git commit -m <message>一次性提交至本地仓库。</message></file></li>
</ul>

<h3 id="22-远程操作">2.2 远程操作</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">命令</th>
      <th style="text-align: left">功能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">git remote add origin &lt;repo_url&gt;</td>
      <td style="text-align: left">关联远程仓库</td>
    </tr>
    <tr>
      <td style="text-align: left">git pull origin &lt;branch-name&gt;</td>
      <td style="text-align: left">拉取远程更新并合并</td>
    </tr>
    <tr>
      <td style="text-align: left">git push origin &lt;branch-name&gt;</td>
      <td style="text-align: left">推送本地分支到远程</td>
    </tr>
    <tr>
      <td style="text-align: left">git push -u origin &lt;branch-name&gt;</td>
      <td style="text-align: left">推送并设置 upstream（后续可直接 git push）</td>
    </tr>
    <tr>
      <td style="text-align: left">git clone &lt;repo_url&gt;</td>
      <td style="text-align: left">克隆远程仓库</td>
    </tr>
  </tbody>
</table>

<p><strong>克隆并创建分支</strong></p>

<pre><code class="language-cmd">git clone &lt;远程仓库地址&gt; -b &lt;分支名&gt; # 会在当前目录下创建一个目录
</code></pre>

<p><strong>拉取远程仓库的变化（GitHub-&gt;本地）</strong></p>

<pre><code class="language-cmd">git pull origin &lt;分支名&gt; # 表示将代码从远程仓库的&lt;分支名&gt;分支，拉取到本地仓库
</code></pre>

<ul>
  <li>分支名默认为master 或 main</li>
  <li>origin 为本地仓库指向远程仓库的指针</li>
</ul>

<p><strong>推送到远程仓库（本地-&gt;GitHub）</strong></p>

<pre><code class="language-cmd">git push origin &lt;分支名&gt; # 表示将代码从本地仓库推送到远程仓库的&lt;分支名&gt;分支
</code></pre>

<h3 id="23-git分支模型">2.3 Git分支模型</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">命令</th>
      <th style="text-align: left">功能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">git branch</td>
      <td style="text-align: left">查看本地分支</td>
    </tr>
    <tr>
      <td style="text-align: left">git branch -r</td>
      <td style="text-align: left">查看远程分支</td>
    </tr>
    <tr>
      <td style="text-align: left">git branch -a</td>
      <td style="text-align: left">查看所有分支（本地 + 远程）</td>
    </tr>
    <tr>
      <td style="text-align: left">git branch 新分支名</td>
      <td style="text-align: left">创建新分支（不会切换）</td>
    </tr>
    <tr>
      <td style="text-align: left">git checkout -b 新分支名 / git switch -c 新分支名</td>
      <td style="text-align: left">创建并切换新分支</td>
    </tr>
    <tr>
      <td style="text-align: left">git checkout 分支名 / git switch 分支名</td>
      <td style="text-align: left">切换分支</td>
    </tr>
    <tr>
      <td style="text-align: left">git branch -d 分支名</td>
      <td style="text-align: left">删除本地分支（已合并）</td>
    </tr>
    <tr>
      <td style="text-align: left">git branch -D 分支名</td>
      <td style="text-align: left">强制删除本地分支（未合并）</td>
    </tr>
    <tr>
      <td style="text-align: left">git push origin –delete 分支名</td>
      <td style="text-align: left">删除远程分支</td>
    </tr>
    <tr>
      <td style="text-align: left">git branch -m 旧分支名 新分支名</td>
      <td style="text-align: left">重命名分支</td>
    </tr>
    <tr>
      <td style="text-align: left">git merge 分支名</td>
      <td style="text-align: left">合并分支（用于将一个分支的更改合并到当前分支）</td>
    </tr>
  </tbody>
</table>

<p><strong>创建远程分支的方法</strong></p>

<p><strong>方法1. 本地创建分支并推送到远程</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git branch v0  # 创建 v0 分支
git switch v0   # 切换到新分支（或使用 `git checkout v0`）
git push -u origin v0
</code></pre></div></div>
<ul>
  <li><code class="language-plaintext highlighter-rouge">-u</code> 的作用是建立“追踪关系”。以后在 <code class="language-plaintext highlighter-rouge">v0</code> 上只需输入 <code class="language-plaintext highlighter-rouge">git push</code> 或 <code class="language-plaintext highlighter-rouge">git pull</code>，Git 就知道对应远程的哪个分支。</li>
</ul>

<p><strong>方法2. 直接在 GitHub 上创建分支</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>打开 GitHub 仓库，进入 "Branches" 选项卡
点击 "New Branch"，输入分支名称（如 feature-xyz）
创建成功后，本地同步该分支：
git fetch origin
git switch feature-xyz  # 切换到远程新分支
git pull origin feature-xyz  # 确保本地最新
</code></pre></div></div>
<h3 id="24-代理">2.4 代理</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
</code></pre></div></div>

<h2 id="3-场景示例">3. 场景示例</h2>

<h3 id="31-本地项目首次推送到远程仓库初始化流程">3.1 本地项目首次推送到远程仓库（初始化流程）</h3>

<p><strong>1. 初始化本地仓库</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd E:
mkdir my_repository
cd E:/my_repository
git init
</code></pre></div></div>

<p><strong>2. 在GitHub创建一个新的仓库</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>打开 GitHub 仓库，创建新的仓库
创建成功后，本地同步：
git remote add origin &lt;远程仓库地址&gt;
    （例如:  https://github.com/your-username/your-repository-name.git        Https方式
             git@github.com/your-username/your-repository-name.git            SSH方式）
git branch -M main  # 创建main分支
</code></pre></div></div>

<ul>
  <li>origin 为本地仓库指向远程仓库的指针， git remote add origin <远程仓库地址>即将origin变量与远程仓库地址进行链接</远程仓库地址></li>
  <li>main或master为远程仓库的分支名称</li>
  <li>main和master其实是一样的，git前期默认分支名为master，后期默认分支名改为main（因为master有sm的含义）</li>
</ul>

<p><strong>3. 本地仓库文件管理</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add .
git commit -m "提交描述"       # -m 参数不可省略
</code></pre></div></div>
<p><strong>4. 将本地仓库推送到GitHub仓库</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push origin main
</code></pre></div></div>
<p><strong>5. 更新本地文件后，需重复3和4操作完成远程同步</strong></p>
<h3 id="32-从远程仓库克隆项目到本地">3.2 从远程仓库克隆项目到本地</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone &lt;远程仓库地址&gt;
</code></pre></div></div>
<h3 id="33-本地修改提交并推送到远程仓库">3.3 本地修改提交并推送到远程仓库</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add .
git commit -m "提交描述"       # -m 参数不可省略
git push origin main
</code></pre></div></div>
<h3 id="34-从远程仓库拉取更新到本地">3.4 从远程仓库拉取更新到本地</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git pull origin main
</code></pre></div></div>

<h3 id="35-将当前main分支的代码保存一份到新的v0分支">3.5 将当前main分支的代码保存一份到新的v0分支</h3>

<p>做法：先在本地创建并切换到 <code class="language-plaintext highlighter-rouge">v0</code>，然后再推送到远程。</p>

<ol>
  <li>创建并切换到 <code class="language-plaintext highlighter-rouge">v0</code> 分支
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout -b v0
</code></pre></div>    </div>
    <ul>
      <li>这条命令会以当前的 <code class="language-plaintext highlighter-rouge">main</code> 代码为基准，创建一个一模一样的 <code class="language-plaintext highlighter-rouge">v0</code> 分支并跳过去。</li>
    </ul>
  </li>
  <li>将 v0 推送到 GitHub到云端：</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push -u origin v0
</code></pre></div></div>
<ul>
  <li><code class="language-plaintext highlighter-rouge">-u</code> 的作用是建立“追踪关系”。以后在 <code class="language-plaintext highlighter-rouge">v0</code> 上只需输入 <code class="language-plaintext highlighter-rouge">git push</code> 或 <code class="language-plaintext highlighter-rouge">git pull</code>，Git 就知道对应远程的哪个分支。</li>
</ul>

<ol>
  <li>切回 main 继续开发</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout main
</code></pre></div></div>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="git" /><summary type="html"><![CDATA[Git使用指南]]></summary></entry><entry><title type="html">python数据结构+算法</title><link href="https://delluna.github.io/posts/2026/03/Python" rel="alternate" type="text/html" title="python数据结构+算法" /><published>2026-03-13T00:00:00+00:00</published><updated>2026-03-13T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2026/03/Python</id><content type="html" xml:base="https://delluna.github.io/posts/2026/03/Python"><![CDATA[<p>python数据结构+算法</p>

<h3 id="python关键字">Python关键字</h3>

<ul>
  <li>break 语句	在语句块执行过程中终止循环，并且跳出整个循环</li>
  <li>continue 语句	在语句块执行过程中终止当前循环，跳出该次循环，执行下一次循环。</li>
</ul>

<h3 id="python常用函数">Python常用函数</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">int</span><span class="p">()</span>   <span class="c1"># 转为整形
</span><span class="n">x</span> <span class="o">=</span><span class="s">'1111'</span>
<span class="n">a</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># 二进制转为十进制
</span><span class="k">print</span><span class="p">(</span><span class="s">"a:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
<span class="n">a</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span> <span class="c1"># 十六进制转为十进制
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">float</span><span class="p">()</span> <span class="c1"># 转为浮点型
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">str</span><span class="p">()</span>   <span class="c1"># 转为字符串
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">hex</span><span class="p">()</span>   <span class="c1"># 转为十六进制
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ord</span><span class="p">()</span>   <span class="c1"># 将一个字符转换为它的整数值        print(ord('a')) # 97
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chr</span><span class="p">()</span>   <span class="c1"># 将一个整数值转换为它的字符形式   print(chr(65))  # 'A'
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">oct</span><span class="p">()</span>   <span class="c1"># 转为八进制
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">bin</span><span class="p">()</span>   <span class="c1"># 将数字映射为二进制字符串    print(bin(8)+bin(12^4)) # '0b10000b1000'
</span></code></pre></div></div>

<h3 id="python位运算符">Python位运算符</h3>

<ul>
  <li>^ 异或</li>
  <li>&amp; 与</li>
  <li>
    <table>
      <tbody>
        <tr>
          <td>或</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li>~ 非</li>
  <li>« 左移   运算数的各二进位全部左移若干位，由 « 右边的数字指定了移动的位数，高位丢弃，低位补0</li>
  <li>&gt;&gt; 右移   把”»“左边的运算数的各二进位全部右移若干位，» 右边的数字指定了移动的位数</li>
</ul>

<h3 id="python字符串">Python字符串</h3>

<h4 id="az与az之间的转换">‘a’~‘z’与’A’~‘Z’之间的转换</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式一：内置函数
</span><span class="n">str1</span> <span class="o">=</span> <span class="s">'SDA'</span>
<span class="n">str1</span> <span class="o">=</span> <span class="n">str1</span><span class="p">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">str1</span><span class="p">)</span>

<span class="n">str2</span> <span class="o">=</span> <span class="s">'sda'</span>
<span class="n">str2</span> <span class="o">=</span> <span class="n">str2</span><span class="p">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">str2</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sda
SDA
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式二：   （a比A的ASCII大32，a为97，A为65）
</span><span class="k">def</span> <span class="nf">to_upper</span><span class="p">(</span><span class="n">char</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">char</span> <span class="o">&gt;=</span> <span class="s">'a'</span> <span class="ow">and</span> <span class="n">char</span> <span class="o">&lt;=</span> <span class="s">'z'</span><span class="p">:</span>
        <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">char</span><span class="p">)</span><span class="o">-</span><span class="mi">32</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">char</span>

<span class="k">def</span> <span class="nf">to_lower</span><span class="p">(</span><span class="n">char</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">char</span> <span class="o">&gt;=</span> <span class="s">'A'</span> <span class="ow">and</span> <span class="n">char</span> <span class="o">&lt;=</span> <span class="s">'Z'</span><span class="p">:</span>
        <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">char</span><span class="p">)</span><span class="o">+</span><span class="mi">32</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">char</span>

<span class="n">str1</span> <span class="o">=</span> <span class="s">'S'</span>
<span class="n">str1</span> <span class="o">=</span> <span class="n">to_lower</span><span class="p">(</span><span class="n">str1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">str1</span><span class="p">)</span>

<span class="n">str2</span> <span class="o">=</span> <span class="s">'a'</span>
<span class="n">str2</span> <span class="o">=</span> <span class="n">to_upper</span><span class="p">(</span><span class="n">str2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">str2</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s
A
</code></pre></div></div>

<p>r/R	# 所有的字符串都是直接按照字面的意思来使用，没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母”r”（可以大小写）以外，与普通字符串有着几乎完全相同的语法。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="sa">r</span><span class="s">'\n'</span><span class="p">)</span> <span class="c1"># 输出结果：\n
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>\n
</code></pre></div></div>

<p>%	格式字符串</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="s">"My name is %s and weight is %d kg!"</span> <span class="o">%</span> <span class="p">(</span><span class="s">'Zara'</span><span class="p">,</span> <span class="mi">21</span><span class="p">))</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>My name is Zara and weight is 21 kg!
</code></pre></div></div>

<h4 id="常用函数">常用函数</h4>
<p>str.count(str, beg=0, end=len(str))   # 返回 str 在 str 里面出现的次数，如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
str.find(str, beg=0, end=len(str))    # 检测 str 是否包含在 str 中，如果 beg 和 end 指定范围，则检查是否包含在指定范围内，如果是返回开始的索引值，否则返回-1
str.join(seq)    # 以 str 作为分隔符，将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
str.replace(str1, str2,  num=str.count(str1)) # 把 str 中的 str1 替换成 str2,如果 num 指定，则替换不超过 num 次.
str.split(str=””, num=str.count(str)) # 以 str 为分隔符切片 str，如果 num 有指定值，则仅分隔 num+1 个子字符串</p>
<h3 id="python元组">Python元组</h3>

<hr />

<ul>
  <li>元组用 () 标识。内部元素用逗号隔开。</li>
  <li>元组不能增加、删除、修改元素，相当于只读列表。</li>
</ul>

<h4 id="1创建元组">1.创建元组</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tup</span> <span class="o">=</span> <span class="p">(</span><span class="s">'physics'</span><span class="p">,</span> <span class="s">'chemistry'</span><span class="p">,</span> <span class="mi">1997</span><span class="p">,</span> <span class="mi">2000</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="2增加元素">2.增加元素</h4>

<p>元组不能二次赋值，相当于只读列表。</p>

<h4 id="3删除元素">3.删除元素</h4>

<p>元组中的元素值不允许删除</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 以下删除元组元素操作是非法的
</span><span class="n">tup</span> <span class="o">=</span> <span class="p">(</span><span class="s">'physics'</span><span class="p">,</span> <span class="s">'chemistry'</span><span class="p">,</span> <span class="mi">1997</span><span class="p">,</span> <span class="mi">2000</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
    <span class="k">del</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</code></pre></div></div>

<p>仅可以使用del语句来删除整个元组</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tup</span> <span class="o">=</span> <span class="p">(</span><span class="s">'physics'</span><span class="p">,</span> <span class="s">'chemistry'</span><span class="p">,</span> <span class="mi">1997</span><span class="p">,</span> <span class="mi">2000</span><span class="p">)</span>
<span class="k">del</span> <span class="n">tup</span>
</code></pre></div></div>

<h4 id="4修改元素">4.修改元素</h4>

<p>元组中的元素值是不允许修改的</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 以下修改元组元素操作是非法的
</span><span class="n">tup</span> <span class="o">=</span> <span class="p">(</span><span class="s">'physics'</span><span class="p">,</span> <span class="s">'chemistry'</span><span class="p">,</span> <span class="mi">1997</span><span class="p">,</span> <span class="mi">2000</span><span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</code></pre></div></div>

<p>但可以对元组进行连接组合（易错点）</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 如下实例:
</span><span class="n">tup1</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">tup2</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="n">tup3</span> <span class="o">=</span> <span class="n">tup1</span> <span class="o">+</span> <span class="n">tup2</span>    <span class="c1"># (1, 2, 3, 4, 5, 6)          易错点、
</span><span class="k">print</span><span class="p">(</span><span class="n">tup3</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="5查找元素">5.查找元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 元组可以使用下标索引来访问元组中的值
</span><span class="n">tup</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span> <span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">tup</span><span class="p">)):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">tup</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>

<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">tup</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="6-列表转换为元组">6. 列表转换为元组</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="n">tup</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">tup</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="python列表">Python列表</h3>

<hr />

<p>列表的数据项不需要具有相同的类型</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 获取每个元素的下标和元素值--enumerate
</span><span class="n">nums</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">num</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">nums</span><span class="p">):</span> 
    <span class="k">print</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 获取二维数组行数和列数
</span><span class="n">matrix</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> 
          <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> 
          <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> 
          <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> 
          <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]]</span>
<span class="n">row</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span>
<span class="n">col</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">row</span><span class="p">,</span><span class="n">col</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="1创建列表">1.创建列表</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#创建一维数组
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">lst2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 创建二维数组 
# 方式一：使用循环
</span><span class="n">rows</span> <span class="o">=</span> <span class="mi">5</span>
<span class="n">cols</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">array</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">rows</span><span class="p">):</span>
    <span class="n">row</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cols</span><span class="p">):</span>
        <span class="n">row</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>  <span class="c1"># 或者使用其他值初始化
</span>    <span class="n">array</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">array</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 创建二维数组 
# 方式二：使用列表推导式
</span><span class="n">rows</span> <span class="o">=</span> <span class="mi">5</span>
<span class="n">cols</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">array</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cols</span><span class="p">)]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">rows</span><span class="p">)]</span>
<span class="k">print</span><span class="p">(</span><span class="n">array</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="2增加元素-1">2.增加元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 增加元素--append()
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[]</span>

<span class="n">lst</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'Google'</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 增加元素--insert()
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[]</span>

<span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">item</span> <span class="o">=</span> <span class="s">'Facebook'</span>
<span class="n">lst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="3删除元素-1">3.删除元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 通过索引删除元素（只删除一个元素）
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="s">'Facebook'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">]</span>

<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">del</span> <span class="n">lst</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>     <span class="c1"># del语句可以删除整个列表或列表中的特定元素。如果要删除特定元素，需要使用其索引。
</span>
<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 通过索引删除元素（只删除一个元素）
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="s">'Facebook'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">]</span>

<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">e</span> <span class="o">=</span> <span class="n">lst</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>  <span class="c1"># 通过索引删除元素，返回元素值。
</span>
<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 通过元素值删除元素，（只删除一个元素）
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="s">'Facebook'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">]</span>

<span class="n">e</span> <span class="o">=</span> <span class="s">'Google'</span>
<span class="n">lst</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 通过元素值删除元素，（删除多个元素）
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="s">'Facebook'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">]</span>

<span class="n">e</span> <span class="o">=</span> <span class="s">'Google'</span>
<span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">lst</span> <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">e</span><span class="p">]</span>

<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="4修改元素-1">4.修改元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="s">'Facebook'</span><span class="p">,</span> <span class="s">'Google'</span><span class="p">]</span>

<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">lst</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="s">'value'</span>

<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="5查找元素-1">5.查找元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">lst</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<span class="n">切片</span>
<span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="c1"># 从第二个元素开始向后截取列表
</span><span class="n">lst</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="c1"># 从第五个元素开始向前截取列表（不包含第五个元素）
</span><span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">]</span>
<span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span> <span class="c1">#Python 列表截取可以接收第三个参数，参数作用是截取的步长，在索引 1 到索引 4 的位置并设置为步长为 2（不包含索引 4 的元素）
</span></code></pre></div></div>

<h4 id="6列表切片">6.列表切片</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]</span>

<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span> <span class="c1"># 从第二个元素开始向后截取列表（包含第二个元素）
</span>
<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">[:</span><span class="mi">4</span><span class="p">])</span> <span class="c1"># 从第五个元素开始向前截取列表（不包含第五个元素）
</span>
<span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">])</span> <span class="c1"># 截取第二个元素到第五个元素（包含第二个元素，不包含第五个元素）
</span>
<span class="c1">#Python 列表截取可以接收第三个参数，参数作用是截取的步长，在索引 1 到索引 4 的位置并设置为步长为 2（不包含索引 4 的元素）
</span><span class="k">print</span><span class="p">(</span><span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">:</span><span class="mi">2</span><span class="p">])</span>
</code></pre></div></div>

<h4 id="列表常用函数">列表常用函数</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="c1"># 列表元素个数
</span><span class="nb">max</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="c1"># 返回列表元素最大值
</span><span class="nb">min</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="c1"># 返回列表元素最小值
</span>
<span class="nb">list</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="c1"># 在列表末尾添加新的对象obj
</span><span class="nb">list</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="c1"># 统计某个元素obj在列表中出现的次数
</span><span class="nb">list</span><span class="p">.</span><span class="n">extend</span><span class="p">(</span><span class="n">seq</span><span class="p">)</span> <span class="c1"># 在列表末尾一次性追加另一个序列中的多个值（用新列表扩展原来的列表）
</span><span class="nb">list</span><span class="p">.</span><span class="n">index</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="c1"># 从列表中找出某个值obj第一个匹配项的索引位置
</span><span class="nb">list</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span> <span class="c1"># 将对象obj插入列表
</span><span class="nb">list</span><span class="p">.</span><span class="n">pop</span><span class="p">([</span><span class="n">index</span><span class="o">=-</span><span class="mi">1</span><span class="p">])</span> <span class="c1"># 移除列表中的一个元素（默认最后一个元素），并且返回该元素的值
</span><span class="nb">list</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="c1"># 移除列表中某个值的第一个匹配项
</span><span class="nb">list</span><span class="p">.</span><span class="n">reverse</span><span class="p">()</span> <span class="c1"># 反向列表中元素
</span><span class="nb">list</span><span class="p">.</span><span class="n">sort</span><span class="p">(</span><span class="nb">cmp</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>    <span class="c1">#对原列表进行排序
</span></code></pre></div></div>

<h3 id="python字典">Python字典</h3>

<hr />

<ul>
  <li>dict 作为 Python 的关键字和内置函数，变量名不建议命名为 dict.</li>
  <li>键一般是唯一的，如果重复最后的一个键值对会替换前面的，值不需要唯一。</li>
  <li>键必须不可变，所以可以用数字，字符串或元组充当，所以用列表就不行        注意：元组可以作为键，列表不行</li>
</ul>

<h4 id="1创建字典">1.创建字典</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 创建空字典
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{}</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 创建字典
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="s">'3'</span><span class="p">}</span>

<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="2增加元素-2">2.增加元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式 1：
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="n">dt</span><span class="p">[</span><span class="s">'key'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'value'</span> 

<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式 2：
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="n">dt</span><span class="p">.</span><span class="n">update</span><span class="p">({</span><span class="s">'key'</span><span class="p">:</span> <span class="s">'value'</span><span class="p">})</span>

<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="3删除元素-2">3.删除元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式一： pop(key[, default])   移除并返回字典中指定键的值，如果键不存在则返回默认值None。
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'c'</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>

<span class="n">key</span> <span class="o">=</span> <span class="mi">100</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">dt</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="o">-</span><span class="mi">999</span><span class="p">)</span> <span class="c1"># 移除并返回字典中指定键的值，如果键不存在则返回 -999。
</span><span class="k">print</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>

<span class="n">key</span> <span class="o">=</span> <span class="s">'a'</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">dt</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式二： del
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'c'</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>

<span class="n">key</span> <span class="o">=</span> <span class="s">'a'</span>
<span class="k">del</span> <span class="n">dt</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>     <span class="c1"># 删除键是'key'的条目
</span>
<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 清空字典
# 方式一： dict.clear()
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'c'</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>

<span class="n">dt</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span>      <span class="c1"># 清空字典所有条目
</span>
<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 清空字典
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'c'</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>

<span class="k">del</span> <span class="n">dt</span>          <span class="c1"># 删除字典
</span>
<span class="k">try</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'发生错误：</span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="4修改元素-2">4.修改元素</h4>

<p>与添加元素一模一样</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式 1：
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="n">dt</span><span class="p">[</span><span class="s">'a'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'value'</span> 

<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 方式 2：
</span><span class="n">dt</span> <span class="o">=</span> <span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="n">dt</span><span class="p">.</span><span class="n">update</span><span class="p">({</span><span class="s">'a'</span><span class="p">:</span> <span class="s">'value'</span><span class="p">})</span>

<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="5查找元素-2">5.查找元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">value</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">[</span><span class="s">'key'</span><span class="p">]</span> <span class="c1"># 如果用字典里没有的键访问数据，会报错
</span><span class="nb">dict</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'key'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span>     <span class="c1">#根据key找对应value，找不到这返回default的值
</span><span class="nb">dict</span><span class="p">.</span><span class="n">keys</span><span class="p">()</span>      <span class="c1"># 输出所有键   输出为[key1, key2,……]
</span><span class="nb">dict</span><span class="p">.</span><span class="n">values</span><span class="p">()</span>    <span class="c1"># 输出所有值   输出为[value1, value2,……]
</span></code></pre></div></div>

<h4 id="字典常用函数">字典常用函数</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">len</span><span class="p">(</span><span class="nb">dict</span><span class="p">)</span> <span class="c1"># 计算字典元素个数，即键的总数。
</span>
<span class="nb">dict</span><span class="p">.</span><span class="n">copy</span><span class="p">()</span> <span class="c1"># 返回一个字典的浅复制
</span>
<span class="nb">dict</span><span class="p">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="c1"># 如果键在字典dict里返回true，否则返回false。Python3 不支持。
</span>
<span class="nb">dict</span><span class="p">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">seq</span><span class="p">[,</span> <span class="n">val</span><span class="p">])</span> <span class="c1"># 创建一个新字典，以序列 seq 中元素做字典的键，val 为字典所有键对应的初始值
</span>
<span class="nb">dict</span><span class="p">.</span><span class="n">items</span><span class="p">()</span> <span class="c1"># 以列表返回可遍历的(键, 值) 元组数组
</span><span class="nb">dict</span><span class="p">.</span><span class="n">keys</span><span class="p">()</span> <span class="c1"># 以列表返回一个字典所有的键
</span><span class="nb">dict</span><span class="p">.</span><span class="n">values</span><span class="p">()</span> <span class="c1"># 以列表返回字典中的所有值
</span>
<span class="nb">dict</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span> <span class="c1"># 返回指定键的值，如果值不在字典中返回default值
</span><span class="nb">dict</span><span class="p">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span> <span class="c1"># 和get()类似, 但如果键不存在于字典中，将会添加键并将值设为default
</span>
<span class="nb">dict</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">dict2</span><span class="p">)</span> <span class="c1"># 把字典dict2的键/值对更新到dict里
</span><span class="nb">dict</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">[,</span><span class="n">default</span><span class="p">])</span> <span class="c1"># 删除字典给定键 key 所对应的值，返回值为被删除的值。key值必须给出。 否则，返回default值。
</span><span class="nb">dict</span><span class="p">.</span><span class="n">popitem</span><span class="p">()</span> <span class="c1"># 返回并删除字典中的最后一对键和值。
</span><span class="nb">dict</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span> <span class="c1"># 删除字典内所有元素
</span></code></pre></div></div>

<h3 id="python双端队列">Python双端队列</h3>

<hr />

<p>append和pop操作的是尾部（右边），appendleft和popleft操作的是头部（左边），别搞混啦</p>

<h4 id="1创建双端队列">1.创建双端队列</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span>
<span class="c1"># 创建一个空的deque
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">()</span>
</code></pre></div></div>

<h4 id="2增加元素-3">2.增加元素</h4>

<p>单个元素的添加</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 头部（左侧）添加元素
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="s">'a'</span><span class="p">,</span> <span class="s">'b'</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">appendleft</span><span class="p">(</span><span class="s">'c'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"输出结果："</span><span class="p">,</span><span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 尾部（右侧）添加元素
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">()</span>
<span class="n">dq</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'a'</span><span class="p">)</span>
<span class="n">dq</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'b'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"输出结果："</span><span class="p">,</span><span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<p>多个元素的批量添加</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 头部（左侧）批量添加（注意顺序会逆序插入）
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">extendleft</span><span class="p">([</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">])</span> 
<span class="k">print</span><span class="p">(</span><span class="s">"输出结果："</span><span class="p">,</span><span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 尾部（右侧）批量添加
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="s">"输出结果："</span><span class="p">,</span><span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="3删除元素-3">3.删除元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 头部（左侧）移除元素
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">])</span>
<span class="n">left_item</span> <span class="o">=</span> <span class="n">dq</span><span class="p">.</span><span class="n">popleft</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">left_item</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 尾部（右侧）移除元素
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">])</span>
<span class="n">right_item</span> <span class="o">=</span> <span class="n">dq</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">right_item</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 删除指定元素（如果存在多个，仅删除第一个）
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>  <span class="c1"># 删除值为 3 的元素（如果存在多个，仅删除第一个）
</span><span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 清空双端队列
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="4修改元素-3">4.修改元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span>
<span class="n">dq</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">100</span>  <span class="c1"># 修改索引 2 位置的元素
</span><span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="5查找元素-3">5.查找元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span>
<span class="n">head</span> <span class="o">=</span> <span class="n">dq</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># 表示头部元素
</span><span class="n">rear</span> <span class="o">=</span> <span class="n">dq</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># 表示尾部元素
</span><span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">rear</span><span class="p">)</span>

<span class="c1"># 插入元素后再查找
</span><span class="n">dq</span><span class="p">.</span><span class="n">appendleft</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">dq</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="n">head</span> <span class="o">=</span> <span class="n">dq</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># 表示头部元素
</span><span class="n">rear</span> <span class="o">=</span> <span class="n">dq</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># 表示尾部元素
</span><span class="k">print</span><span class="p">(</span><span class="s">'两端插入元素后'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">rear</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="6旋转元素">6.旋转元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 往右转两步
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">rotate</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>  <span class="c1"># deque([4, 5, 1, 2, 3])
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 往左转三步
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">rotate</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>  <span class="c1"># deque([2, 3, 4, 5, 1])
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 翻转双端队列
</span><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">reverse</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="python集合">Python集合</h3>

<hr />

<p>没有重复元素</p>

<h4 id="1创建集合">1.创建集合</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#1.用{}创建set集合
</span><span class="n">person</span> <span class="o">=</span><span class="p">{</span><span class="s">"student"</span><span class="p">,</span><span class="s">"teacher"</span><span class="p">,</span><span class="s">"babe"</span><span class="p">,</span><span class="mi">123</span><span class="p">,</span><span class="mi">321</span><span class="p">,</span><span class="mi">123</span><span class="p">}</span> <span class="c1">#同样各种类型嵌套,可以赋值重复数据，但是存储会去重
</span><span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">)</span> <span class="c1">#但是显示出来则是去重的   输出：  {321, 'teacher', 'student', 'babe', 123}
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#2.空set集合用set()函数表示
</span><span class="n">person1</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="c1">#表示空set，不能用person1={}
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#3.用set()函数创建set集合
</span><span class="n">person2</span> <span class="o">=</span> <span class="nb">set</span><span class="p">((</span><span class="s">"hello"</span><span class="p">,</span><span class="s">"jerry"</span><span class="p">,</span><span class="mi">133</span><span class="p">,</span><span class="mi">11</span><span class="p">,</span><span class="mi">133</span><span class="p">,</span><span class="s">"jerru"</span><span class="p">))</span> <span class="c1">#只能传入一个参数，可以是list,tuple等 类型
</span><span class="k">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">person2</span><span class="p">))</span> <span class="c1"># 输出： 5
</span><span class="k">print</span><span class="p">(</span><span class="n">person2</span><span class="p">)</span>  <span class="c1"># 输出： {133, 'jerry', 11, 'jerru', 'hello'}
</span></code></pre></div></div>

<h4 id="2增加元素-4">2.增加元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">add</span><span class="p">()</span><span class="n">不会拆分</span><span class="err">；</span><span class="n">update</span><span class="p">()</span><span class="n">会拆分</span>
<span class="n">person</span> <span class="o">=</span><span class="p">{</span><span class="s">"student"</span><span class="p">,</span><span class="s">"teacher"</span><span class="p">,</span><span class="s">"babe"</span><span class="p">,</span><span class="mi">123</span><span class="p">,</span><span class="mi">321</span><span class="p">,</span><span class="mi">123</span><span class="p">}</span>
<span class="n">person</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="s">"student"</span><span class="p">)</span> <span class="c1">#如果元素已经存在，则不报错，也不会添加,不会将字符串拆分成多个元素，区别update
</span><span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">)</span>   <span class="c1"># 输出：{321, 'babe', 'teacher', 'student', 123}
</span><span class="n">person</span><span class="p">.</span><span class="n">add</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">23</span><span class="p">,</span><span class="s">"hello"</span><span class="p">))</span> <span class="c1">#可以添加元组，但不能是list
</span><span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">)</span>   <span class="c1"># 输出： {(1, 23, 'hello'), 321, 'babe', 'teacher', 'student', 123}
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">person</span><span class="p">.</span><span class="n">update</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span> <span class="c1">#可以使用update添加一些元组列表，字典等。但不能是字符串，否则会拆分
</span><span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">)</span>   <span class="c1"># 输出：{321, 1, 3, 'teacher', (1, 23, 'hello'), 'babe', 'student', 123}
</span><span class="n">person</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="s">"abc"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">)</span>  <span class="c1">#会将字符串拆分成a,b，c三个元素    输出： {321, 1, 3, 'b', 'c', 'teacher', (1, 23, 'hello'), 'a', 'babe', 'student', 123}
</span></code></pre></div></div>

<h4 id="3删除元素-4">3.删除元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">person</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="s">"student"</span><span class="p">)</span><span class="c1">#按元素去删除
</span><span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">)</span>  <span class="c1"># 如果不存在 ，会报错。
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">person</span><span class="p">.</span><span class="n">discard</span><span class="p">(</span><span class="s">"student"</span><span class="p">)</span><span class="c1">#功能和remove一样，好处是没有的话，不会报错
</span><span class="n">person</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span> <span class="c1">#在list里默认删除最后一个，在set里随机删除一个。
</span></code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 直接清空set
</span><span class="n">person</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span>
</code></pre></div></div>

<h4 id="4修改元素-4">4.修改元素</h4>

<p>更新set中某个元素,因为是无序的，所以不能用角标。
一般更新都是使用remove,然后在add。</p>

<h4 id="5查找元素-4">5.查找元素</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 查询是否存在，无法返回索引，使用in判断
</span><span class="k">if</span> <span class="s">"teacher"</span> <span class="ow">in</span> <span class="n">person</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"true"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"不存在"</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="6其他操作">6.其他操作</h4>

<p>交集∩</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">set1</span> <span class="o">&amp;</span> <span class="n">set2</span>
</code></pre></div></div>

<p>并集∪</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">set1</span> <span class="o">|</span> <span class="n">set2</span>
</code></pre></div></div>

<p>差集</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">set1</span> <span class="o">-</span> <span class="n">set2</span>
</code></pre></div></div>

<p>对称差  获取两个集合中不重叠的元素。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">set1</span> <span class="o">^</span> <span class="n">set2</span>
</code></pre></div></div>

<h3 id="math模块">math模块</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">math</span>
<span class="n">math</span><span class="p">.</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>  <span class="c1"># 返回数字的绝对值，如abs(-10) 返回 10
</span><span class="n">math</span><span class="p">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="c1"># 返回数字的上入整数，如math.ceil(4.1) 返回 5
</span><span class="n">math</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>	<span class="c1"># 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
</span><span class="n">math</span><span class="p">.</span><span class="n">floor</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>	<span class="c1"># 返回数字的下舍整数，如math.floor(4.9)返回 4
</span><span class="n">math</span><span class="p">.</span><span class="n">log</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>	<span class="c1"># 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
</span><span class="n">math</span><span class="p">.</span><span class="n">log10</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>	<span class="c1"># 返回以10为基数的x的对数，如math.log10(100)返回 2.0
</span><span class="n">math</span><span class="p">.</span><span class="nb">max</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,...)</span>	<span class="c1"># 返回给定参数的最大值，参数可以为序列。
</span><span class="n">math</span><span class="p">.</span><span class="nb">min</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,...)</span>	<span class="c1"># 返回给定参数的最小值，参数可以为序列。
</span><span class="n">math</span><span class="p">.</span><span class="n">modf</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>	<span class="c1"># 返回x的整数部分与小数部分，两部分的数值符号与x相同，整数部分以浮点型表示。
</span><span class="n">math</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>	<span class="c1"># x**y 运算后的值。
</span><span class="n">math</span><span class="p">.</span><span class="nb">round</span><span class="p">(</span><span class="n">x</span> <span class="p">[,</span><span class="n">n</span><span class="p">])</span>	<span class="c1"># 返回浮点数x的四舍五入值，如给出n值，则代表舍入到小数点后的位数。
</span><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>	<span class="c1"># 返回数字x的平方根
</span>
<span class="n">math</span><span class="p">.</span><span class="n">choice</span><span class="p">(</span><span class="n">seq</span><span class="p">)</span>	<span class="c1"># 从序列的元素中随机挑选一个元素，比如random.choice(range(10))，从0到9中随机挑选一个整数。
</span><span class="n">math</span><span class="p">.</span><span class="n">randrange</span> <span class="p">([</span><span class="n">start</span><span class="p">,]</span> <span class="n">stop</span> <span class="p">[,</span><span class="n">step</span><span class="p">])</span>	<span class="c1"># 从指定范围内，按指定基数递增的集合中获取一个随机数，基数默认值为 1
</span><span class="n">math</span><span class="p">.</span><span class="n">random</span><span class="p">()</span>	<span class="c1"># 随机生成下一个实数，它在[0,1)范围内。
</span><span class="n">math</span><span class="p">.</span><span class="n">seed</span><span class="p">([</span><span class="n">x</span><span class="p">])</span>	<span class="c1"># 改变随机数生成器的种子seed。如果你不了解其原理，你不必特别去设定seed，Python会帮你选择seed。
</span><span class="n">math</span><span class="p">.</span><span class="n">shuffle</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>	<span class="c1"># 将序列的所有元素随机排序
</span><span class="n">math</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>	<span class="c1"># 随机生成下一个实数，它在[x,y]范围内。
</span></code></pre></div></div>

<h3 id="代数">代数</h3>
<ul>
  <li>代数的核心思想 是用符号（变量）代替数，进行方程求解和数学运算。</li>
  <li>汉语中的“代数” 是从西方数学翻译而来的，意思是用符号（变量）代替数值进行运算，所以称为“代数”。</li>
</ul>

<h3 id="泰勒级数">泰勒级数</h3>
<ul>
  <li>使用泰勒级数近似计算 f(x) 的值</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">sympy</span> <span class="k">as</span> <span class="n">sp</span>

<span class="k">def</span> <span class="nf">taylor_expansion</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">x_val</span><span class="p">):</span>
    <span class="s">""" 使用泰勒级数近似计算 f(x) 在 x=a 附近的值 """</span>
    
    <span class="c1"># 1. 定义符号变量 x（SymPy 用于符号计算）
</span>    <span class="n">x</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">Symbol</span><span class="p">(</span><span class="s">'x'</span><span class="p">)</span>  
    
    <span class="c1"># 2. 将输入函数 f(x) 转换为 sympy 表达式
</span>    <span class="n">f_sym</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>  
    
    <span class="c1"># 3. 初始化泰勒展开的结果
</span>    <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span>  

    <span class="c1"># 4. 计算 0 到 n-1 阶的泰勒展开
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>  
        <span class="c1"># 4.1 计算 f(x) 的 i 阶导数，并在 x=a 处求值
</span>        <span class="n">derivative</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">diff</span><span class="p">(</span><span class="n">f_sym</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">i</span><span class="p">).</span><span class="n">subs</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>  
        
        <span class="c1"># 4.2 计算泰勒展开的第 i 项
</span>        <span class="n">term</span> <span class="o">=</span> <span class="p">(</span><span class="n">derivative</span> <span class="o">/</span> <span class="n">math</span><span class="p">.</span><span class="n">factorial</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="n">x_val</span> <span class="o">-</span> <span class="n">a</span><span class="p">)</span> <span class="o">**</span> <span class="n">i</span>  
        
        <span class="c1"># 4.3 将该项累加到最终结果
</span>        <span class="n">result</span> <span class="o">+=</span> <span class="n">term</span>  

    <span class="c1"># 5. 返回计算后的近似值，并转换为 float 以兼容 NumPy
</span>    <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>  

<span class="c1"># 测试 e^x 在 x=0 处的 5 阶展开，估算 e^0.5
</span><span class="n">f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">sp</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>  <span class="c1"># 定义 e^x
</span><span class="n">approx_value</span> <span class="o">=</span> <span class="n">taylor_expansion</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>

<span class="c1"># 输出计算结果
</span><span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"泰勒展开近似值: </span><span class="si">{</span><span class="n">approx_value</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"e^0.5 的真实值: </span><span class="si">{</span><span class="n">np</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>  <span class="c1"># 对比真实值
</span></code></pre></div></div>

<h3 id="输入输出-两数求和">输入输出 两数求和</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">sys</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">stdin</span><span class="p">.</span><span class="n">readline</span><span class="p">().</span><span class="n">strip</span><span class="p">()</span>
<span class="n">array</span> <span class="o">=</span> <span class="n">line</span><span class="p">.</span><span class="n">split</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">array</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">array</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</code></pre></div></div>

<h3 id="查找算法">查找算法</h3>

<hr />

<h4 id="简单查找">简单查找</h4>
<ul>
  <li>时间复杂度：O(n)</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">simple_search</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">lst</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">item</span> <span class="o">==</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">index</span>
    <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<h4 id="二分查找">二分查找</h4>
<ul>
  <li>要求列表有序</li>
  <li>时间复杂度：O(logn)</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">binary_search</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
    <span class="n">low</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">high</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
    <span class="k">while</span> <span class="n">low</span> <span class="o">&lt;=</span> <span class="n">high</span><span class="p">:</span>
        <span class="n">cur</span> <span class="o">=</span> <span class="p">(</span><span class="n">low</span> <span class="o">+</span> <span class="n">high</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>
        <span class="k">if</span> <span class="n">lst</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">==</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">cur</span>
        <span class="k">elif</span> <span class="n">lst</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">high</span> <span class="o">=</span> <span class="n">cur</span> <span class="o">-</span> <span class="mi">1</span>
        <span class="k">elif</span> <span class="n">lst</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">low</span> <span class="o">=</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<h4 id="二叉树查找">二叉树查找</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Node</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">left</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">right</span> <span class="o">=</span> <span class="bp">None</span>

<span class="k">class</span> <span class="nc">BinarySearchTree</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">root</span> <span class="o">=</span> <span class="bp">None</span>

    <span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">root</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">root</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">_insert</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">root</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="c1"># 如果 key 小于当前节点的值，则插入到左子树
</span>        <span class="k">if</span> <span class="n">key</span> <span class="o">&lt;</span> <span class="n">node</span><span class="p">.</span><span class="n">key</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">node</span><span class="p">.</span><span class="n">left</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">node</span><span class="p">.</span><span class="n">left</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">_insert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
        <span class="c1"># 如果 key 大于当前节点的值，则插入到右子树
</span>        <span class="k">elif</span> <span class="n">key</span> <span class="o">&gt;</span> <span class="n">node</span><span class="p">.</span><span class="n">key</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">node</span><span class="p">.</span><span class="n">right</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">node</span><span class="p">.</span><span class="n">right</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">_insert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">_search</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">root</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="c1"># 如果节点为空或找到了目标值，返回结果
</span>        <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">node</span><span class="p">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">node</span>
        <span class="c1"># 如果目标值小于当前节点的值，则在左子树查找
</span>        <span class="k">elif</span> <span class="n">key</span> <span class="o">&lt;</span> <span class="n">node</span><span class="p">.</span><span class="n">key</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">_search</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
        <span class="c1"># 如果目标值大于当前节点的值，则在右子树查找
</span>        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">_search</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">print_inorder</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">_inorder</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">root</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_inorder</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">node</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">_inorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">key</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">" "</span><span class="p">)</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">_inorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>

<span class="c1"># 使用示例
</span><span class="n">bst</span> <span class="o">=</span> <span class="n">BinarySearchTree</span><span class="p">()</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">40</span><span class="p">)</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">70</span><span class="p">)</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
<span class="n">bst</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">80</span><span class="p">)</span>

<span class="c1"># 查找
</span><span class="n">result</span> <span class="o">=</span> <span class="n">bst</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="mi">40</span><span class="p">)</span>
<span class="k">if</span> <span class="n">result</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Found:"</span><span class="p">,</span> <span class="n">result</span><span class="p">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Not Found"</span><span class="p">)</span>

<span class="c1"># 打印树的中序遍历（升序）
</span><span class="n">bst</span><span class="p">.</span><span class="n">print_inorder</span><span class="p">()</span>  <span class="c1"># 输出：20 30 40 50 60 70 80
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Found: 40
20 30 40 50 60 70 80 
</code></pre></div></div>

<h4 id="哈希表查找">哈希表查找</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">HashTable</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span>  <span class="c1"># 哈希表大小
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">table</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="n">size</span>  <span class="c1"># 初始化哈希表为大小为 size 的列表
</span>
    <span class="k">def</span> <span class="nf">hash_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="s">"""简单的哈希函数：key 对哈希表大小取模"""</span>
        <span class="k">return</span> <span class="n">key</span> <span class="o">%</span> <span class="bp">self</span><span class="p">.</span><span class="n">size</span>

    <span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
        <span class="s">"""插入 key-value 对"""</span>
        <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">hash_function</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>  <span class="c1"># 计算哈希值
</span>        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">[(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)]</span>  <span class="c1"># 如果该位置为空，直接插入
</span>        <span class="k">else</span><span class="p">:</span>
            <span class="c1"># 处理哈希冲突：如果该位置已经有数据，采用链表法（在链表中插入新元素）
</span>            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">])):</span>
                <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>  <span class="c1"># 如果已有相同的 key，更新值
</span>                    <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
                    <span class="k">return</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>  <span class="c1"># 没有相同 key，追加到链表
</span>
    <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="s">"""查找 key 对应的值"""</span>
        <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">hash_function</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>  <span class="c1"># 如果该位置为空，表示 key 不存在
</span>        <span class="k">else</span><span class="p">:</span>
            <span class="c1"># 遍历链表，查找是否有对应的 key
</span>            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
                <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
                    <span class="k">return</span> <span class="n">v</span>
        <span class="k">return</span> <span class="bp">None</span>  <span class="c1"># 没找到对应的 key
</span>
    <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="s">"""删除 key 对应的元素"""</span>
        <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">hash_function</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>  <span class="c1"># 如果该位置为空，表示 key 不存在
</span>        <span class="k">else</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]):</span>
                <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
                    <span class="k">del</span> <span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">i</span><span class="p">]</span>  <span class="c1"># 删除 key-value 对
</span>                    <span class="k">return</span>
        <span class="k">return</span> <span class="bp">None</span>  <span class="c1"># 没有找到对应的 key
</span>
    <span class="k">def</span> <span class="nf">print_table</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s">"""打印哈希表"""</span>
        <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">table</span><span class="p">):</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">bucket</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>


<span class="c1"># 使用哈希表的示例
</span><span class="n">hash_table</span> <span class="o">=</span> <span class="n">HashTable</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>  <span class="c1"># 创建一个大小为 10 的哈希表
</span>
<span class="c1"># 插入数据
</span><span class="n">hash_table</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="s">"Value10"</span><span class="p">)</span>
<span class="n">hash_table</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="s">"Value20"</span><span class="p">)</span>
<span class="n">hash_table</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="s">"Value15"</span><span class="p">)</span>
<span class="n">hash_table</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="s">"Value25"</span><span class="p">)</span>
<span class="n">hash_table</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="s">"Value5"</span><span class="p">)</span>

<span class="c1"># 查找数据
</span><span class="k">print</span><span class="p">(</span><span class="s">"Search for key 15:"</span><span class="p">,</span> <span class="n">hash_table</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="mi">15</span><span class="p">))</span>  <span class="c1"># 输出: Value15
</span><span class="k">print</span><span class="p">(</span><span class="s">"Search for key 30:"</span><span class="p">,</span> <span class="n">hash_table</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span>  <span class="c1"># 输出: None
</span>
<span class="c1"># 删除数据
</span><span class="n">hash_table</span><span class="p">.</span><span class="n">delete</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"After deleting key 15:"</span><span class="p">)</span>
<span class="n">hash_table</span><span class="p">.</span><span class="n">print_table</span><span class="p">()</span>

<span class="c1"># 查找删除后的数据
</span><span class="k">print</span><span class="p">(</span><span class="s">"Search for key 15 after deletion:"</span><span class="p">,</span> <span class="n">hash_table</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="mi">15</span><span class="p">))</span>  <span class="c1"># 输出: None
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Search for key 15: Value15
Search for key 30: None
After deleting key 15:
Index 0: [(10, 'Value10'), (20, 'Value20')]
Index 1: None
Index 2: None
Index 3: None
Index 4: None
Index 5: [(25, 'Value25'), (5, 'Value5')]
Index 6: None
Index 7: None
Index 8: None
Index 9: None
Search for key 15 after deletion: None
</code></pre></div></div>

<h3 id="排序算法">排序算法</h3>

<hr />

<table>
  <thead>
    <tr>
      <th>排序算法</th>
      <th>最好时间复杂度</th>
      <th>平均时间复杂度</th>
      <th>最坏时间复杂度</th>
      <th>空间复杂度</th>
      <th>是否稳定</th>
      <th>适用场景</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>冒泡排序</strong></td>
      <td>(O(n))</td>
      <td>(O(n^2))</td>
      <td>(O(n^2))</td>
      <td>(O(1))</td>
      <td>✅ 稳定</td>
      <td>适用于数据量小、基本有序的情况</td>
    </tr>
    <tr>
      <td><strong>选择排序</strong></td>
      <td>(O(n^2))</td>
      <td>(O(n^2))</td>
      <td>(O(n^2))</td>
      <td>(O(1))</td>
      <td>❌ 不稳定</td>
      <td>适用于数据量小，对稳定性无要求</td>
    </tr>
    <tr>
      <td><strong>插入排序</strong></td>
      <td>(O(n))</td>
      <td>(O(n^2))</td>
      <td>(O(n^2))</td>
      <td>(O(1))</td>
      <td>✅ 稳定</td>
      <td>适用于数据基本有序的情况</td>
    </tr>
    <tr>
      <td><strong>希尔排序</strong></td>
      <td>(O(n \log n))</td>
      <td>依赖 gap 选择</td>
      <td>(O(n^2))</td>
      <td>(O(1))</td>
      <td>❌ 不稳定</td>
      <td>适用于中等规模数据，无额外空间需求</td>
    </tr>
    <tr>
      <td><strong>归并排序</strong></td>
      <td>(O(n \log n))</td>
      <td>(O(n \log n))</td>
      <td>(O(n \log n))</td>
      <td>(O(n))</td>
      <td>✅ 稳定</td>
      <td>适用于大规模数据，需要稳定性</td>
    </tr>
    <tr>
      <td><strong>快速排序</strong></td>
      <td>(O(n \log n))</td>
      <td>(O(n \log n))</td>
      <td>(O(n^2))（最坏）</td>
      <td>(O(\log n))（递归栈）</td>
      <td>❌ 不稳定</td>
      <td>适用于一般场景，是最快的排序算法之一</td>
    </tr>
    <tr>
      <td><strong>堆排序</strong></td>
      <td>(O(n \log n))</td>
      <td>(O(n \log n))</td>
      <td>(O(n \log n))</td>
      <td>(O(1))</td>
      <td>❌ 不稳定</td>
      <td>适用于大规模数据、需要节省空间</td>
    </tr>
    <tr>
      <td><strong>计数排序</strong></td>
      <td>(O(n + k))</td>
      <td>(O(n + k))</td>
      <td>(O(n + k))</td>
      <td>(O(k))</td>
      <td>✅ 稳定</td>
      <td>适用于整数、小范围数据</td>
    </tr>
    <tr>
      <td><strong>基数排序</strong></td>
      <td>(O(nk))</td>
      <td>(O(nk))</td>
      <td>(O(nk))</td>
      <td>(O(n + k))</td>
      <td>✅ 稳定</td>
      <td>适用于定长整数、字符串排序</td>
    </tr>
    <tr>
      <td><strong>桶排序</strong></td>
      <td>(O(n + k))</td>
      <td>(O(n + k))</td>
      <td>(O(n^2))</td>
      <td>(O(n + k))</td>
      <td>✅ 稳定</td>
      <td>适用于数据分布均匀的情况</td>
    </tr>
  </tbody>
</table>

<hr />

<p><strong>如何选择合适的排序算法？</strong></p>
<ol>
  <li><strong>数据量小（&lt; 1,000）</strong>
    <ul>
      <li><strong>已基本有序</strong> → <strong>插入排序</strong></li>
      <li><strong>随机数据</strong> → <strong>选择排序</strong> 或 <strong>冒泡排序</strong></li>
    </ul>
  </li>
  <li><strong>数据量中等（1,000 ~ 100,000）</strong>
    <ul>
      <li><strong>对稳定性要求高</strong> → <strong>归并排序</strong></li>
      <li><strong>对空间复杂度要求高</strong> → <strong>快速排序（最常用）</strong></li>
      <li><strong>内存受限</strong> → <strong>堆排序</strong></li>
    </ul>
  </li>
  <li><strong>数据量很大（&gt; 100,000）</strong>
    <ul>
      <li><strong>整数范围较小</strong> → <strong>计数排序 / 基数排序 / 桶排序</strong></li>
      <li><strong>通用排序</strong> → <strong>快速排序 / 归并排序</strong></li>
    </ul>
  </li>
</ol>

<p>快速排序通常是 <strong>通用情况下最快的排序算法</strong>，但当需要稳定排序或处理大规模数据时，可以选择 <strong>归并排序、、堆排序或基数排序</strong></p>

<h4 id="选择排序">选择排序</h4>

<ul>
  <li>思想：数组分为已排序和未排序两部分，每次从未排序部分选择最小（或最大）的元素，放到已排序部分的末尾，直到所有元素都被排序。</li>
  <li>步骤：
    <ol>
      <li>从数组中找到最小的元素，将其与数组的第一个元素交换位置。</li>
      <li>在剩下的未排序部分中，找到最小的元素，将其与第二个位置的元素交换。</li>
      <li>重复上述步骤，直到所有元素都排好序。</li>
    </ol>
  </li>
  <li>时间复杂度：
    <ul>
      <li>最好情况：O(n<sup>2</sup>)</li>
      <li>最坏情况：O(n<sup>2</sup>)</li>
      <li>平均时间复杂度：O(n<sup>2</sup>)</li>
    </ul>
  </li>
  <li>空间复杂度：原地排序，不占额外内存， O(1)</li>
  <li>不稳定排序</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">selection_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
        <span class="n">min_index</span> <span class="o">=</span> <span class="n">i</span>
        <span class="c1"># 在未排序部分寻找最小值
</span>        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">arr</span><span class="p">[</span><span class="n">min_index</span><span class="p">]:</span>
                <span class="n">min_index</span> <span class="o">=</span> <span class="n">j</span>
        <span class="c1"># 交换最小值与当前位置
</span>        <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">min_index</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">min_index</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">arr</span>

<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
<span class="n">sorted_arr</span> <span class="o">=</span> <span class="n">selection_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">sorted_arr</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[1, 2, 5, 5, 6, 9]
</code></pre></div></div>

<h4 id="插入排序">插入排序</h4>

<ul>
  <li>思想：数组分为已排序和未排序两部分，每次从未排序部分取一个元素，插入到已排序部分的正确位置，直到所有元素都被插入。</li>
  <li>时间复杂度
    <ul>
      <li>最好情况（数组本身已排序）：O(n)</li>
      <li>最坏情况（数组是逆序的）：O(n<sup>2</sup>)</li>
      <li>平均情况：O(n<sup>2</sup>)</li>
    </ul>
  </li>
  <li>空间复杂度：原地排序，不需要额外的数组存储， O(1)</li>
  <li>稳定排序（相同元素的相对顺序不会改变）</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">insertion_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
        <span class="n">key</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
        <span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span>
        <span class="c1"># 将比 key 大的元素后移
</span>        <span class="k">while</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">key</span><span class="p">:</span>
            <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
            <span class="n">j</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="c1"># 插入 key
</span>        <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
    <span class="k">return</span> <span class="n">arr</span>

<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
<span class="n">sorted_arr</span> <span class="o">=</span> <span class="n">selection_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">sorted_arr</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[1, 2, 5, 5, 6, 9]
</code></pre></div></div>

<h4 id="希尔排序">希尔排序</h4>

<ul>
  <li>希尔排序（Shell Sort）是插入排序的改进版，通过分组减少逆序对，加快排序速度。</li>
  <li>步骤：
    <ol>
      <li>选择一个步长（gap），将数组按这个间隔分组，对每组进行插入排序。</li>
      <li>逐步缩小步长，直到 gap = 1 时，进行最后一次插入排序，使整个数组有序。</li>
      <li>由于步长逐渐减小，数据在最后几轮排序时已接近有序，因此最终的插入排序速度快。</li>
    </ol>
  </li>
  <li>时间复杂度（取决于步长序列（gap））：
    <ul>
      <li>最好情况：O(n<sup>2</sup>)</li>
      <li>最好情况：O(nlogn)</li>
      <li>平均情况：通常优于O(n<sup>2</sup>)，但具体复杂外的数组存储）</li>
    </ul>
  </li>
  <li>空间复杂：原地排序，O(1)</li>
  <li>不稳定排序</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">shell_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
    <span class="n">gap</span> <span class="o">=</span> <span class="n">n</span> <span class="o">//</span> <span class="mi">2</span>  <span class="c1"># 初始步长
</span>
    <span class="k">while</span> <span class="n">gap</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">gap</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
            <span class="n">temp</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">j</span> <span class="o">=</span> <span class="n">i</span>
            <span class="c1"># 对当前分组使用插入排序
</span>            <span class="k">while</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="n">gap</span> <span class="ow">and</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">-</span> <span class="n">gap</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">temp</span><span class="p">:</span>
                <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">-</span> <span class="n">gap</span><span class="p">]</span>
                <span class="n">j</span> <span class="o">-=</span> <span class="n">gap</span>
            <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">temp</span>
        <span class="n">gap</span> <span class="o">//=</span> <span class="mi">2</span>  <span class="c1"># 缩小步长
</span>
    <span class="k">return</span> <span class="n">arr</span>

<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">12</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">sorted_arr</span> <span class="o">=</span> <span class="n">shell_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">sorted_arr</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[2, 3, 12, 34, 54]
</code></pre></div></div>

<h4 id="冒泡排序">冒泡排序</h4>

<ul>
  <li>思想：不断比较相邻的元素并交换，使较大的元素逐步“冒泡”到数组的末尾，直到整个数组有序。</li>
  <li>时间复杂度：
    <ul>
      <li>最好情况：（已经有序，优化版）：O(n)</li>
      <li>最坏情况（完全逆序）：O(n<sup>2</sup>)</li>
      <li>平均情况：O(n<sup>2</sup>)</li>
    </ul>
  </li>
  <li>空间复杂度：O(1)</li>
  <li>稳定排序，相等的元素不会交换位置。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">bubble_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>  <span class="c1"># 需要进行 n-1 轮遍历
</span>        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">i</span><span class="p">):</span>  <span class="c1"># 每轮遍历，最大元素会“浮”到最后
</span>            <span class="k">if</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]:</span>  <span class="c1"># 交换相邻元素
</span>                <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">arr</span>

<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">64</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">90</span><span class="p">]</span>
<span class="n">sorted_arr</span> <span class="o">=</span> <span class="n">bubble_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">sorted_arr</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[11, 12, 22, 25, 34, 64, 90]
</code></pre></div></div>

<h4 id="基数排序">基数排序</h4>

<ul>
  <li>思想：基数排序（Radix Sort） 是一种非比较排序算法，适用于整数排序或固定长度的字符串排序。它的核心思想是按位分组，逐位排序，从最低位到最高位（或反向）进行多轮稳定排序，使整个数组变得有序。</li>
  <li>时间复杂度
    <ul>
      <li>最好情况：O(nk)  （k 为最大数的位数）</li>
      <li>最坏情况：O(nk)</li>
      <li>平均时间复杂度：O(nk) （通常k«n，接近O(n)）</li>
    </ul>
  </li>
  <li>空间复杂度
    <ul>
      <li>额外存储桶或计数数组，通常为 O(n+k)</li>
    </ul>
  </li>
  <li>稳定排序</li>
  <li>特点：
    <ul>
      <li>适用于整数和定长字符串</li>
      <li>❌ 额外空间消耗较大（需要额外存储桶或数组）</li>
      <li>❌ 不适用于小数、负数（需要额外处理）</li>
      <li>适用于大规模数据排序（如电话号、身份证号排序），但在一般情况下，快速排序或归并排序更常用。</li>
    </ul>
  </li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">counting_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">exp</span><span class="p">):</span>
    <span class="s">"""对数组按照 exp 位进行计数排序"""</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
    <span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span>
    <span class="n">count</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">10</span>  <span class="c1"># 0-9 数字的计数
</span>
    <span class="c1"># 统计每个数字出现的次数
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="n">index</span> <span class="o">=</span> <span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">//</span> <span class="n">exp</span><span class="p">)</span> <span class="o">%</span> <span class="mi">10</span>
        <span class="n">count</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="c1"># 累加，计算每个数字的最终位置
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span>
        <span class="n">count</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">count</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>

    <span class="c1"># 逆序填充 output，保证稳定性
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
        <span class="n">index</span> <span class="o">=</span> <span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">//</span> <span class="n">exp</span><span class="p">)</span> <span class="o">%</span> <span class="mi">10</span>
        <span class="n">output</span><span class="p">[</span><span class="n">count</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
        <span class="n">count</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span>

    <span class="c1"># 复制回原数组
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">output</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">radix_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="s">"""基数排序"""</span>
    <span class="n">max_num</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>  <span class="c1"># 找到最大数，确定排序轮数
</span>    <span class="n">exp</span> <span class="o">=</span> <span class="mi">1</span>  <span class="c1"># 逐位排序（1, 10, 100, ...）
</span>    
    <span class="k">while</span> <span class="n">max_num</span> <span class="o">//</span> <span class="n">exp</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">counting_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">exp</span><span class="p">)</span>
        <span class="n">exp</span> <span class="o">*=</span> <span class="mi">10</span>  <span class="c1"># 进位
</span>
<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">170</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">802</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">66</span><span class="p">]</span>
<span class="n">radix_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[2, 24, 45, 66, 75, 90, 170, 802]
</code></pre></div></div>

<h4 id="快速排序">快速排序</h4>

<ul>
  <li>思想：快速排序是一种分治算法，通过选择一个“基准元素（pivot）”，将数组分为两部分，使得左侧所有元素小于基准，右侧所有元素大于基准，然后对两部分递归排序。</li>
  <li>时间复杂度
    <ul>
      <li>最好情况：O(nlogn) 处理的列表本身有序且基准值总选择为列表第len(lst)//2项</li>
      <li>最坏情况：O(n<sup>2</sup>) 处理的列表本身有序且基准值总选择为列表第一项</li>
      <li>平均时间复杂度：O(nlogn)</li>
    </ul>
  </li>
  <li>空间复杂度
    <ul>
      <li>递归版本需要额外空间存储子数组，最坏情况下空间复杂度为 O(n)。</li>
      <li>原地快排（in-place） 仅需 O(logn) 额外栈空间（递归调用）。</li>
    </ul>
  </li>
  <li>不稳定排序</li>
  <li>实现快速排序时，请随机地选择用作基准值的元素。</li>
  <li>大O表示法中的常量有时候事关重大，这就是快速排序比合并排序快的原因所在。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">quick_sort</span><span class="p">(</span><span class="n">lst</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">lst</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">pivot</span> <span class="o">=</span> <span class="n">lst</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">less</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">greater</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">lst</span><span class="p">)):</span>
            <span class="k">if</span> <span class="n">lst</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">pivot</span><span class="p">:</span>
                <span class="n">less</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">lst</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">greater</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">lst</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">quick_sort</span><span class="p">(</span><span class="n">less</span><span class="p">)</span> <span class="o">+</span> <span class="p">[</span><span class="n">pivot</span><span class="p">]</span> <span class="o">+</span> <span class="n">quick_sort</span><span class="p">(</span><span class="n">greater</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="归并排序">归并排序</h4>
<ul>
  <li>思想：归并排序是一种分治算法（Divide and Conquer），它的基本思想是：（1）拆分：递归地将数组分成两半，直到每个子数组的长度为 1。
（2）合并：将两个有序子数组合并成一个有序数组。</li>
  <li>时间复杂度
    <ul>
      <li>最好情况：O(nlogn)</li>
      <li>最坏情况：O(nlogn)</li>
      <li>平均时间复杂度：O(nlogn)</li>
    </ul>
  </li>
  <li>空间复杂度 O(n)</li>
  <li>稳定排序</li>
  <li>适用于大规模数据排序</li>
  <li>相比快速排序，常数因子较大，实际运行速度可能较慢（尤其是在小数据集上）</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">arr</span>  <span class="c1"># 递归终止条件，数组长度为 1
</span>
    <span class="c1"># 1. 拆分数组
</span>    <span class="n">mid</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>
    <span class="n">left</span> <span class="o">=</span> <span class="n">merge_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">[:</span><span class="n">mid</span><span class="p">])</span>  <span class="c1"># 排序左半部分
</span>    <span class="n">right</span> <span class="o">=</span> <span class="n">merge_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">mid</span><span class="p">:])</span>  <span class="c1"># 排序右半部分
</span>
    <span class="c1"># 2. 合并两个有序数组
</span>    <span class="k">return</span> <span class="n">merge</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">i</span> <span class="o">=</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="ow">and</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">right</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">left</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">right</span><span class="p">[</span><span class="n">j</span><span class="p">]:</span>  <span class="c1"># 保持稳定性
</span>            <span class="n">result</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">left</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
            <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">result</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">right</span><span class="p">[</span><span class="n">j</span><span class="p">])</span>
            <span class="n">j</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="c1"># 处理剩余元素
</span>    <span class="n">result</span><span class="p">.</span><span class="n">extend</span><span class="p">(</span><span class="n">left</span><span class="p">[</span><span class="n">i</span><span class="p">:])</span>
    <span class="n">result</span><span class="p">.</span><span class="n">extend</span><span class="p">(</span><span class="n">right</span><span class="p">[</span><span class="n">j</span><span class="p">:])</span>
    
    <span class="k">return</span> <span class="n">result</span>

<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">38</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">43</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">82</span><span class="p">,</span> <span class="mi">10</span><span class="p">]</span>
<span class="n">sorted_arr</span> <span class="o">=</span> <span class="n">merge_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">sorted_arr</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[3, 9, 10, 27, 38, 43, 82]
</code></pre></div></div>

<h4 id="堆排序">堆排序</h4>

<ul>
  <li>思想：堆排序 是一种 基于二叉堆（Binary Heap） 的排序算法，它的核心思想是：（1）构建最大堆（大顶堆），使得堆顶元素是整个数组的最大值。（2）不断交换堆顶元素和末尾元素，然后调整堆，直到排序完成。</li>
  <li>时间复杂度
    <ul>
      <li>构造堆：O(n)</li>
      <li>堆排序：O(nlogn)</li>
      <li>总体时间复杂度：O(nlogn)</li>
    </ul>
  </li>
  <li>空间复杂度：原地排序，O(1)</li>
  <li>不稳定排序</li>
  <li>特点：
    <ul>
      <li>常数开销较大，速度一般比快速排序慢</li>
      <li>堆排序适用于 需要稳定 O(nlogn) 时间复杂度，且不能使用额外空间的情况，如 优先队列、操作系统调度等。</li>
    </ul>
  </li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">heapify</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
    <span class="s">"""维护堆的性质"""</span>
    <span class="n">largest</span> <span class="o">=</span> <span class="n">i</span>  <span class="c1"># 假设当前节点是最大值
</span>    <span class="n">left</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>  <span class="c1"># 左子节点
</span>    <span class="n">right</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">2</span>  <span class="c1"># 右子节点
</span>
    <span class="c1"># 如果左子节点比当前节点大，更新 largest
</span>    <span class="k">if</span> <span class="n">left</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">arr</span><span class="p">[</span><span class="n">left</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">arr</span><span class="p">[</span><span class="n">largest</span><span class="p">]:</span>
        <span class="n">largest</span> <span class="o">=</span> <span class="n">left</span>

    <span class="c1"># 如果右子节点比当前节点大，更新 largest
</span>    <span class="k">if</span> <span class="n">right</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">arr</span><span class="p">[</span><span class="n">right</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">arr</span><span class="p">[</span><span class="n">largest</span><span class="p">]:</span>
        <span class="n">largest</span> <span class="o">=</span> <span class="n">right</span>

    <span class="c1"># 如果 largest 发生变化，则交换并继续调整
</span>    <span class="k">if</span> <span class="n">largest</span> <span class="o">!=</span> <span class="n">i</span><span class="p">:</span>
        <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">largest</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">largest</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
        <span class="n">heapify</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">largest</span><span class="p">)</span>  <span class="c1"># 递归调整子树
</span>
<span class="k">def</span> <span class="nf">heap_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
    <span class="s">"""堆排序"""</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>

    <span class="c1"># 1. 构建最大堆（从最后一个非叶子节点开始调整）
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">//</span> <span class="mi">2</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
        <span class="n">heapify</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>

    <span class="c1"># 2. 交换堆顶元素和末尾元素，并调整堆
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
        <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>  <span class="c1"># 交换最大元素到数组末尾
</span>        <span class="n">heapify</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># 调整剩余堆结构
</span>
<span class="c1"># 示例
</span><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">heap_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>  <span class="c1"># 输出 [1, 3, 4, 5, 10]
</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[1, 3, 4, 5, 10]
</code></pre></div></div>

<h3 id="python-库手册heapq-最小堆模块">Python 库手册:<em>heapq</em> 最小堆模块</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">heapq</span>
<span class="k">def</span> <span class="nf">lastStoneWeight</span><span class="p">(</span><span class="n">stones</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
    <span class="n">h</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">stones</span><span class="p">]</span>
    <span class="n">heapq</span><span class="p">.</span><span class="n">heapify</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">stones</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="n">y</span> <span class="o">=</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span>
        <span class="k">if</span> <span class="n">x</span> <span class="o">!=</span> <span class="n">y</span><span class="p">:</span>
            <span class="n">heapq</span><span class="p">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="p">(</span><span class="n">y</span><span class="o">-</span><span class="n">x</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">h</span><span class="p">)</span><span class="o">*-</span><span class="mi">1</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="mi">0</span>

<span class="k">print</span><span class="p">(</span><span class="n">lastStoneWeight</span><span class="p">([</span><span class="mi">1</span><span class="p">]))</span>

</code></pre></div></div>

<h3 id="树算法">树算法</h3>

<hr />

<h4 id="平衡二叉树">平衡二叉树</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>


</code></pre></div></div>

<h4 id="哈夫曼编码">哈夫曼编码</h4>

<ul>
  <li>哈夫曼编码（Huffman Coding） 是一种用于数据压缩的算法，它通过使用不同长度的二进制编码来表示不同的字符，以便最常见的字符用较短的编码表示，而不常见的字符用较长的编码表示，从而实现数据压缩。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">heapq</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>

<span class="c1"># 哈夫曼树节点类
</span><span class="k">class</span> <span class="nc">Node</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">char</span><span class="p">,</span> <span class="n">freq</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">char</span> <span class="o">=</span> <span class="n">char</span>  <span class="c1"># 字符
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">freq</span> <span class="o">=</span> <span class="n">freq</span>  <span class="c1"># 字符频率
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">left</span> <span class="o">=</span> <span class="bp">None</span>  <span class="c1"># 左子树
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">right</span> <span class="o">=</span> <span class="bp">None</span>  <span class="c1"># 右子树
</span>
    <span class="c1"># 为了让堆排序时比较节点频率
</span>    <span class="k">def</span> <span class="nf">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">freq</span> <span class="o">&lt;</span> <span class="n">other</span><span class="p">.</span><span class="n">freq</span>

<span class="c1"># 构建哈夫曼编码
</span><span class="k">def</span> <span class="nf">build_huffman_tree</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
    <span class="c1"># 统计字符频率
</span>    <span class="n">frequency</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
        <span class="n">frequency</span><span class="p">[</span><span class="n">char</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
    
    <span class="c1"># 创建最小堆（优先队列）
</span>    <span class="n">heap</span> <span class="o">=</span> <span class="p">[</span><span class="n">Node</span><span class="p">(</span><span class="n">char</span><span class="p">,</span> <span class="n">freq</span><span class="p">)</span> <span class="k">for</span> <span class="n">char</span><span class="p">,</span> <span class="n">freq</span> <span class="ow">in</span> <span class="n">frequency</span><span class="p">.</span><span class="n">items</span><span class="p">()]</span>
    <span class="n">heapq</span><span class="p">.</span><span class="n">heapify</span><span class="p">(</span><span class="n">heap</span><span class="p">)</span>
    
    <span class="c1"># 构建哈夫曼树
</span>    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">heap</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="c1"># 取出两个频率最小的节点
</span>        <span class="n">left</span> <span class="o">=</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">heap</span><span class="p">)</span>
        <span class="n">right</span> <span class="o">=</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">heap</span><span class="p">)</span>
        
        <span class="c1"># 创建新节点，频率为左右子节点之和
</span>        <span class="n">merged</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">left</span><span class="p">.</span><span class="n">freq</span> <span class="o">+</span> <span class="n">right</span><span class="p">.</span><span class="n">freq</span><span class="p">)</span>
        <span class="n">merged</span><span class="p">.</span><span class="n">left</span> <span class="o">=</span> <span class="n">left</span>
        <span class="n">merged</span><span class="p">.</span><span class="n">right</span> <span class="o">=</span> <span class="n">right</span>
        
        <span class="c1"># 将新节点插入堆中
</span>        <span class="n">heapq</span><span class="p">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">heap</span><span class="p">,</span> <span class="n">merged</span><span class="p">)</span>
    
    <span class="c1"># 返回哈夫曼树的根节点
</span>    <span class="k">return</span> <span class="n">heap</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

<span class="c1"># 为哈夫曼树生成编码
</span><span class="k">def</span> <span class="nf">generate_huffman_codes</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s">''</span><span class="p">,</span> <span class="n">codebook</span><span class="o">=</span><span class="p">{}):</span>
    <span class="k">if</span> <span class="n">root</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">codebook</span>
    
    <span class="c1"># 如果是叶子节点（字符节点），将字符和编码保存
</span>    <span class="k">if</span> <span class="n">root</span><span class="p">.</span><span class="n">char</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">codebook</span><span class="p">[</span><span class="n">root</span><span class="p">.</span><span class="n">char</span><span class="p">]</span> <span class="o">=</span> <span class="n">prefix</span>
    
    <span class="c1"># 递归地生成左子树和右子树的编码
</span>    <span class="n">generate_huffman_codes</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">,</span> <span class="n">prefix</span> <span class="o">+</span> <span class="s">'0'</span><span class="p">,</span> <span class="n">codebook</span><span class="p">)</span>
    <span class="n">generate_huffman_codes</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">,</span> <span class="n">prefix</span> <span class="o">+</span> <span class="s">'1'</span><span class="p">,</span> <span class="n">codebook</span><span class="p">)</span>
    
    <span class="k">return</span> <span class="n">codebook</span>

<span class="c1"># 对文本进行哈夫曼编码
</span><span class="k">def</span> <span class="nf">huffman_encode</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
    <span class="n">root</span> <span class="o">=</span> <span class="n">build_huffman_tree</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>  <span class="c1"># 构建哈夫曼树
</span>    <span class="n">codes</span> <span class="o">=</span> <span class="n">generate_huffman_codes</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>  <span class="c1"># 生成哈夫曼编码
</span>    <span class="n">encoded_text</span> <span class="o">=</span> <span class="s">''</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">codes</span><span class="p">[</span><span class="n">char</span><span class="p">]</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">text</span><span class="p">)</span>  <span class="c1"># 将原文本编码
</span>    <span class="k">return</span> <span class="n">encoded_text</span><span class="p">,</span> <span class="n">codes</span>

<span class="c1"># 对编码后的文本进行解码
</span><span class="k">def</span> <span class="nf">huffman_decode</span><span class="p">(</span><span class="n">encoded_text</span><span class="p">,</span> <span class="n">codes</span><span class="p">):</span>
    <span class="c1"># 反向构建解码表
</span>    <span class="n">reverse_codes</span> <span class="o">=</span> <span class="p">{</span><span class="n">v</span><span class="p">:</span> <span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">codes</span><span class="p">.</span><span class="n">items</span><span class="p">()}</span>
    <span class="n">decoded_text</span> <span class="o">=</span> <span class="s">''</span>
    <span class="n">prefix</span> <span class="o">=</span> <span class="s">''</span>
    
    <span class="c1"># 遍历编码文本，逐步匹配解码
</span>    <span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="n">encoded_text</span><span class="p">:</span>
        <span class="n">prefix</span> <span class="o">+=</span> <span class="n">bit</span>
        <span class="k">if</span> <span class="n">prefix</span> <span class="ow">in</span> <span class="n">reverse_codes</span><span class="p">:</span>
            <span class="n">decoded_text</span> <span class="o">+=</span> <span class="n">reverse_codes</span><span class="p">[</span><span class="n">prefix</span><span class="p">]</span>
            <span class="n">prefix</span> <span class="o">=</span> <span class="s">''</span>  <span class="c1"># 重置prefix
</span>    
    <span class="k">return</span> <span class="n">decoded_text</span>

<span class="c1"># 使用示例
</span><span class="n">text</span> <span class="o">=</span> <span class="s">"this is an example for huffman encoding"</span>
<span class="n">encoded_text</span><span class="p">,</span> <span class="n">codes</span> <span class="o">=</span> <span class="n">huffman_encode</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"原始文本:"</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"哈夫曼编码:"</span><span class="p">,</span> <span class="n">encoded_text</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"哈夫曼编码表:"</span><span class="p">,</span> <span class="n">codes</span><span class="p">)</span>

<span class="c1"># 解码示例
</span><span class="n">decoded_text</span> <span class="o">=</span> <span class="n">huffman_decode</span><span class="p">(</span><span class="n">encoded_text</span><span class="p">,</span> <span class="n">codes</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"解码后的文本:"</span><span class="p">,</span> <span class="n">decoded_text</span><span class="p">)</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>原始文本: this is an example for huffman encoding
哈夫曼编码: 0101001001001001010110010010101111100010111100111011110011100000110111101011101110010110010101001100011011101001111110001011110000011111100101011100100010001
哈夫曼编码表: {'n': '000', 's': '0010', 'm': '0011', 'h': '0100', 't': '01010', 'd': '01011', 'r': '01100', 'l': '01101', 'x': '01110', 'c': '01111', 'p': '10000', 'g': '10001', 'i': '1001', ' ': '101', 'u': '11000', 'o': '11001', 'f': '1101', 'e': '1110', 'a': '1111'}
解码后的文本: this is an example for huffman encoding
</code></pre></div></div>

<h3 id="图算法">图算法</h3>

<hr />

<h4 id="深度优先搜索dfs">深度优先搜索（DFS）</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span>
<span class="k">def</span> <span class="nf">dfs</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">root</span><span class="p">):</span>
    <span class="n">visited</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
    <span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="n">root</span><span class="p">])</span>
    <span class="k">while</span> <span class="n">dq</span><span class="p">:</span>
        <span class="n">vertex</span> <span class="o">=</span> <span class="n">dq</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>     <span class="c1">#DFS使用栈，先进后出
</span>        <span class="k">if</span> <span class="n">vertex</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
            <span class="n">visited</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">vertex</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="n">vertex</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">' '</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">neighbour</span> <span class="ow">in</span> <span class="n">graph</span><span class="p">[</span><span class="n">vertex</span><span class="p">]:</span>
            <span class="k">if</span> <span class="n">neighbour</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
                <span class="n">dq</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">neighbour</span><span class="p">)</span>

<span class="c1"># 有向图的邻接表表示
</span><span class="n">graph</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'A'</span><span class="p">:</span> <span class="p">[</span><span class="s">'B'</span><span class="p">,</span> <span class="s">'C'</span><span class="p">],</span>
    <span class="s">'B'</span><span class="p">:</span> <span class="p">[</span><span class="s">'D'</span><span class="p">,</span> <span class="s">'E'</span><span class="p">],</span>
    <span class="s">'C'</span><span class="p">:</span> <span class="p">[</span><span class="s">'F'</span><span class="p">],</span>
    <span class="s">'D'</span><span class="p">:</span> <span class="p">[],</span>
    <span class="s">'E'</span><span class="p">:</span> <span class="p">[</span><span class="s">'F'</span><span class="p">],</span>
    <span class="s">'F'</span><span class="p">:</span> <span class="p">[]</span>
<span class="p">}</span>

<span class="n">dfs</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="s">'A'</span><span class="p">)</span> 
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A C F B E D 
</code></pre></div></div>

<h4 id="广度优先搜索bfs">广度优先搜索（BFS）</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span>
<span class="k">def</span> <span class="nf">bfs</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">root</span><span class="p">):</span>
    <span class="n">visited</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
    <span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="n">root</span><span class="p">])</span>
    <span class="k">while</span> <span class="n">dq</span><span class="p">:</span>
        <span class="n">vertex</span> <span class="o">=</span> <span class="n">dq</span><span class="p">.</span><span class="n">popleft</span><span class="p">()</span>    <span class="c1"># BFS使用队列，先进先出
</span>        <span class="k">if</span> <span class="n">vertex</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
            <span class="n">visited</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">vertex</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="n">vertex</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">" "</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">neighbour</span> <span class="ow">in</span> <span class="n">graph</span><span class="p">[</span><span class="n">vertex</span><span class="p">]:</span>
            <span class="k">if</span> <span class="n">neighbour</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
                <span class="n">dq</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">neighbour</span><span class="p">)</span>

<span class="c1"># 有向图的邻接表表示
</span><span class="n">graph</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'A'</span><span class="p">:</span> <span class="p">[</span><span class="s">'B'</span><span class="p">,</span> <span class="s">'C'</span><span class="p">],</span>
    <span class="s">'B'</span><span class="p">:</span> <span class="p">[</span><span class="s">'D'</span><span class="p">,</span> <span class="s">'E'</span><span class="p">],</span>
    <span class="s">'C'</span><span class="p">:</span> <span class="p">[</span><span class="s">'F'</span><span class="p">],</span>
    <span class="s">'D'</span><span class="p">:</span> <span class="p">[],</span>
    <span class="s">'E'</span><span class="p">:</span> <span class="p">[</span><span class="s">'F'</span><span class="p">],</span>
    <span class="s">'F'</span><span class="p">:</span> <span class="p">[]</span>
<span class="p">}</span>

<span class="n">bfs</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="s">'A'</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A B C D E F 
</code></pre></div></div>

<h4 id="最小生成树prim算法">最小生成树：Prim算法</h4>

<ul>
  <li>最小生成树是图中连接所有顶点的边的集合，且这组边的总权值最小。</li>
  <li>Prim算法是一种用于求解最小生成树（MST，Minimum Spanning Tree）的问题的贪心算法。</li>
  <li>思想：Prim算法通过从一个起始顶点开始，每次从队列中取出权重最小的边，如果这条边连接的节点中有一个已经访问过而另一个没有访问过，则将该边添加到生成树中，并将未访问的节点标记为已访问，直到所有顶点都被包含</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">heapq</span>  <span class="c1"># 导入堆（优先队列）
</span>
<span class="k">class</span> <span class="nc">Graph</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">vertices</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">V</span> <span class="o">=</span> <span class="n">vertices</span>  <span class="c1"># 顶点数
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">graph</span> <span class="o">=</span> <span class="p">{}</span>  <span class="c1"># 图的邻接表
</span>    
    <span class="k">def</span> <span class="nf">add_edge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span><span class="p">):</span>
        <span class="s">"""向图中添加边，边的格式是(u, v, weight)"""</span>
        <span class="k">if</span> <span class="n">u</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">if</span> <span class="n">v</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">append</span><span class="p">((</span><span class="n">v</span><span class="p">,</span> <span class="n">weight</span><span class="p">))</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">[</span><span class="n">v</span><span class="p">].</span><span class="n">append</span><span class="p">((</span><span class="n">u</span><span class="p">,</span> <span class="n">weight</span><span class="p">))</span>
    
    <span class="k">def</span> <span class="nf">prim</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">):</span>
        <span class="s">"""运行Prim算法，构造最小生成树"""</span>
        <span class="n">mst</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># 存储最小生成树的边
</span>        <span class="n">visited</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>  <span class="c1"># 记录已访问的顶点
</span>        <span class="n">min_heap</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># 最小堆（优先队列）
</span>
        <span class="c1"># 从起始顶点开始
</span>        <span class="n">visited</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">neighbor</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">[</span><span class="n">start</span><span class="p">]:</span>
            <span class="n">heapq</span><span class="p">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">min_heap</span><span class="p">,</span> <span class="p">(</span><span class="n">weight</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">neighbor</span><span class="p">))</span>  <span class="c1"># 将所有与起始顶点相连的边加入堆
</span>        
        <span class="k">while</span> <span class="n">min_heap</span><span class="p">:</span>
            <span class="n">weight</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">min_heap</span><span class="p">)</span>  <span class="c1"># 弹出权重最小的边
</span>            <span class="k">if</span> <span class="n">v</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>  <span class="c1"># 如果v尚未访问
</span>                <span class="n">visited</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>  <span class="c1"># 标记v为已访问
</span>                <span class="n">mst</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span><span class="p">))</span>  <span class="c1"># 将这条边加入最小生成树
</span>                <span class="k">for</span> <span class="n">neighbor</span><span class="p">,</span> <span class="n">w</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">graph</span><span class="p">[</span><span class="n">v</span><span class="p">]:</span>  <span class="c1"># 遍历与v相连的边
</span>                    <span class="k">if</span> <span class="n">neighbor</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
                        <span class="n">heapq</span><span class="p">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">min_heap</span><span class="p">,</span> <span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">neighbor</span><span class="p">))</span>  <span class="c1"># 将未访问的边加入堆
</span>        
        <span class="k">return</span> <span class="n">mst</span>

<span class="c1"># 使用示例
</span><span class="n">g</span> <span class="o">=</span> <span class="n">Graph</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>  <span class="c1"># 创建一个包含5个顶点的图
</span>
<span class="c1"># 添加边：格式为 (u, v, weight)
</span><span class="n">g</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">g</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="n">g</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>
<span class="n">g</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">g</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
<span class="n">g</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>

<span class="c1"># 运行Prim算法，选择顶点0作为起始点
</span><span class="n">mst</span> <span class="o">=</span> <span class="n">g</span><span class="p">.</span><span class="n">prim</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>

<span class="c1"># 输出最小生成树
</span><span class="k">print</span><span class="p">(</span><span class="s">"最小生成树的边及权重："</span><span class="p">)</span>
<span class="k">for</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">mst</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"(</span><span class="si">{</span><span class="n">u</span><span class="si">}</span><span class="s">, </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="s">) -&gt; 权重: </span><span class="si">{</span><span class="n">weight</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>最小生成树的边及权重：
(0, 1) -&gt; 权重: 2
(1, 2) -&gt; 权重: 3
(2, 4) -&gt; 权重: 5
(0, 3) -&gt; 权重: 6
</code></pre></div></div>

<h4 id="最小生成树克鲁斯卡尔kruskal算法">最小生成树：克鲁斯卡尔（Kruskal）算法</h4>

<ul>
  <li>克鲁斯卡尔算法（Kruskal’s Algorithm） 是一种用于求解最小生成树（MST，Minimum Spanning Tree）问题的贪心算法。</li>
  <li>与 Prim 算法不同，克鲁斯卡尔算法并不是从一个起始顶点开始构建生成树，而是通过边的权重来进行排序。</li>
  <li>思想：如果最小权值边连接的两个顶点不在同一个连通块中，则将这条边加入生成树，并将这两个顶点合并到同一连通块。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">DisjointSet</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">parent</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>  <span class="c1"># parent[i] 表示节点i的父节点
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">rank</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span>  <span class="c1"># rank[i] 用于优化合并操作
</span>
    <span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">u</span><span class="p">):</span>
        <span class="s">"""查找并查集中的根节点"""</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">!=</span> <span class="n">u</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>  <span class="c1"># 路径压缩
</span>        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">u</span><span class="p">]</span>

    <span class="k">def</span> <span class="nf">union</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
        <span class="s">"""合并两个集合"""</span>
        <span class="n">root_u</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">)</span>
        <span class="n">root_v</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">root_u</span> <span class="o">!=</span> <span class="n">root_v</span><span class="p">:</span>
            <span class="c1"># 按秩合并（小的树合并到大的树下面）
</span>            <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">rank</span><span class="p">[</span><span class="n">root_u</span><span class="p">]</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="p">.</span><span class="n">rank</span><span class="p">[</span><span class="n">root_v</span><span class="p">]:</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">root_v</span><span class="p">]</span> <span class="o">=</span> <span class="n">root_u</span>
            <span class="k">elif</span> <span class="bp">self</span><span class="p">.</span><span class="n">rank</span><span class="p">[</span><span class="n">root_u</span><span class="p">]</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="p">.</span><span class="n">rank</span><span class="p">[</span><span class="n">root_v</span><span class="p">]:</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">root_u</span><span class="p">]</span> <span class="o">=</span> <span class="n">root_v</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">parent</span><span class="p">[</span><span class="n">root_v</span><span class="p">]</span> <span class="o">=</span> <span class="n">root_u</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">rank</span><span class="p">[</span><span class="n">root_u</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>

<span class="k">class</span> <span class="nc">Kruskal</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">vertices</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">V</span> <span class="o">=</span> <span class="n">vertices</span>  <span class="c1"># 顶点数
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">edges</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># 存储图的边
</span>
    <span class="k">def</span> <span class="nf">add_edge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span><span class="p">):</span>
        <span class="s">"""添加边到图中"""</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">edges</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">weight</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">kruskal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s">"""运行克鲁斯卡尔算法，返回最小生成树"""</span>
        <span class="c1"># 1. 对边按权重排序
</span>        <span class="bp">self</span><span class="p">.</span><span class="n">edges</span><span class="p">.</span><span class="n">sort</span><span class="p">()</span>  <span class="c1"># 按照边的权重进行升序排序
</span>        
        <span class="c1"># 2. 初始化并查集
</span>        <span class="n">dsu</span> <span class="o">=</span> <span class="n">DisjointSet</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">V</span><span class="p">)</span>
        
        <span class="n">mst</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># 存储最小生成树的边
</span>        
        <span class="c1"># 3. 遍历所有边
</span>        <span class="k">for</span> <span class="n">weight</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">edges</span><span class="p">:</span>
            <span class="c1"># 4. 判断u和v是否在同一连通块中
</span>            <span class="k">if</span> <span class="n">dsu</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">)</span> <span class="o">!=</span> <span class="n">dsu</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
                <span class="n">mst</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span><span class="p">))</span>  <span class="c1"># 将这条边加入最小生成树
</span>                <span class="n">dsu</span><span class="p">.</span><span class="n">union</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>  <span class="c1"># 合并u和v所在的连通块
</span>
        <span class="k">return</span> <span class="n">mst</span>

<span class="c1"># 使用示例
</span><span class="n">kruskal</span> <span class="o">=</span> <span class="n">Kruskal</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>  <span class="c1"># 创建一个包含6个顶点的图
</span>
<span class="c1"># 添加边：格式为 (u, v, weight)
</span><span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
<span class="n">kruskal</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>

<span class="c1"># 运行克鲁斯卡尔算法
</span><span class="n">mst</span> <span class="o">=</span> <span class="n">kruskal</span><span class="p">.</span><span class="n">kruskal</span><span class="p">()</span>

<span class="c1"># 输出最小生成树
</span><span class="k">print</span><span class="p">(</span><span class="s">"最小生成树的边及权重："</span><span class="p">)</span>
<span class="k">for</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">mst</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"(</span><span class="si">{</span><span class="n">u</span><span class="si">}</span><span class="s">, </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="s">) -&gt; 权重: </span><span class="si">{</span><span class="n">weight</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>最小生成树的边及权重：
(1, 2) -&gt; 权重: 2
(2, 3) -&gt; 权重: 3
(0, 1) -&gt; 权重: 4
(3, 4) -&gt; 权重: 6
(4, 5) -&gt; 权重: 7
</code></pre></div></div>

<h4 id="最短距离dijkstra算法">最短距离：dijkstra算法</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">vis_parents</span><span class="p">(</span><span class="n">parents</span><span class="p">):</span>
    <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span>
    <span class="n">d</span> <span class="o">=</span> <span class="n">deque</span><span class="p">()</span>
    <span class="n">node</span> <span class="o">=</span> <span class="n">parents</span><span class="p">[</span><span class="s">'final'</span><span class="p">]</span>
    <span class="k">while</span> <span class="n">node</span> <span class="o">!=</span> <span class="s">'start'</span><span class="p">:</span>
        <span class="n">d</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="n">node</span> <span class="o">=</span> <span class="n">parents</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
    <span class="nb">str</span> <span class="o">=</span> <span class="s">'start'</span>
    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">node</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
        <span class="nb">str</span> <span class="o">=</span> <span class="nb">str</span> <span class="o">+</span> <span class="s">' -&gt; '</span> <span class="o">+</span> <span class="n">node</span>
    <span class="k">return</span> <span class="nb">str</span> <span class="o">+</span> <span class="s">'-&gt; final'</span>

<span class="k">def</span> <span class="nf">find_lowest_cost_node</span><span class="p">(</span><span class="n">costs</span><span class="p">,</span> <span class="n">processed</span><span class="p">):</span>
    <span class="n">lowest_node</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="n">lowest_value</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s">'inf'</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">costs</span><span class="p">.</span><span class="n">keys</span><span class="p">():</span>
        <span class="k">if</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">processed</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="k">if</span> <span class="n">costs</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">lowest_value</span><span class="p">:</span>
            <span class="n">lowest_value</span> <span class="o">=</span> <span class="n">costs</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
            <span class="n">lowest_node</span> <span class="o">=</span> <span class="n">n</span>
    <span class="k">return</span> <span class="n">lowest_node</span>

<span class="k">def</span> <span class="nf">dijkstra</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">costs</span><span class="p">,</span> <span class="n">parents</span><span class="p">):</span>
    <span class="n">processed</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">node</span> <span class="o">=</span> <span class="n">find_lowest_cost_node</span><span class="p">(</span><span class="n">costs</span><span class="p">,</span> <span class="n">processed</span><span class="p">)</span>
    <span class="k">while</span> <span class="n">node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">cost</span> <span class="o">=</span> <span class="n">costs</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
        <span class="n">neighbors</span> <span class="o">=</span> <span class="n">graph</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">neighbors</span><span class="p">.</span><span class="n">keys</span><span class="p">():</span>
            <span class="k">if</span> <span class="n">neighbors</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">+</span> <span class="n">cost</span> <span class="o">&lt;</span> <span class="n">costs</span><span class="p">[</span><span class="n">n</span><span class="p">]:</span>
                <span class="n">costs</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">neighbors</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">+</span> <span class="n">cost</span>
                <span class="n">parents</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span>
        <span class="n">processed</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="n">node</span> <span class="o">=</span> <span class="n">find_lowest_cost_node</span><span class="p">(</span><span class="n">costs</span><span class="p">,</span> <span class="n">processed</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">vis_parents</span><span class="p">(</span><span class="n">parents</span><span class="p">)</span>

<span class="c1"># 构建图
</span><span class="n">graph</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">graph</span><span class="p">[</span><span class="s">'start'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'A'</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
    <span class="s">'B'</span><span class="p">:</span> <span class="mi">2</span>
<span class="p">}</span>
<span class="n">graph</span><span class="p">[</span><span class="s">'A'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'final'</span><span class="p">:</span> <span class="mi">1</span>
<span class="p">}</span>

<span class="n">graph</span><span class="p">[</span><span class="s">'B'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'A'</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>
    <span class="s">'final'</span><span class="p">:</span> <span class="mi">5</span>
<span class="p">}</span>
<span class="n">graph</span><span class="p">[</span><span class="s">'final'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>

<span class="c1"># 构建开销表
</span><span class="n">infinity</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s">'inf'</span><span class="p">)</span>
<span class="n">costs</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'A'</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
    <span class="s">'B'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
    <span class="s">'final'</span><span class="p">:</span> <span class="n">infinity</span>
<span class="p">}</span>

<span class="c1"># 构建父节点表
</span><span class="n">parents</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'A'</span><span class="p">:</span> <span class="s">'start'</span><span class="p">,</span>
    <span class="s">'B'</span><span class="p">:</span> <span class="s">'start'</span><span class="p">,</span>
    <span class="s">'final'</span><span class="p">:</span> <span class="bp">None</span>
<span class="p">}</span>

<span class="nb">str</span> <span class="o">=</span> <span class="n">dijkstra</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">costs</span><span class="p">,</span> <span class="n">parents</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="nb">str</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="最短距离floyd算法">最短距离：floyd算法</h4>

<ul>
  <li>用于解决<strong>所有顶点</strong>对最短路径问题的经典算法。该算法通过动态规划的思想，计算图中所有顶点之间的最短路径。</li>
  <li>时间复杂度：O(V³)，其中V是图中的顶点数。每次都需要遍历所有顶点进行更新。</li>
  <li>空间复杂度：O(V²)，用于存储距离矩阵。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">INF</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s">'inf'</span><span class="p">)</span>  <span class="c1"># 用来表示无穷大
</span>
<span class="k">def</span> <span class="nf">floyd_warshall</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">V</span><span class="p">):</span>
    <span class="c1"># 初始化距离矩阵
</span>    <span class="n">dist</span> <span class="o">=</span> <span class="p">[[</span><span class="n">INF</span><span class="p">]</span> <span class="o">*</span> <span class="n">V</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">)]</span>
    
    <span class="c1"># 将图的边权值放入距离矩阵中
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
        <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>  <span class="c1"># 从一个顶点到自己的距离为0
</span>    <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">graph</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">[]):</span>
            <span class="n">dist</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">weight</span>  <span class="c1"># 设置已知边的权重
</span>
    <span class="c1"># 动态规划计算最短路径
</span>    <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
            <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
                <span class="c1"># 更新最短路径
</span>                <span class="k">if</span> <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">dist</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]:</span>
                    <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">dist</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span>
    
    <span class="k">return</span> <span class="n">dist</span>

<span class="c1"># 使用示例
</span><span class="n">graph</span> <span class="o">=</span> <span class="p">{</span>
    <span class="mi">0</span><span class="p">:</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)],</span>
    <span class="mi">1</span><span class="p">:</span> <span class="p">[(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)],</span>
    <span class="mi">2</span><span class="p">:</span> <span class="p">[(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)],</span>
    <span class="mi">3</span><span class="p">:</span> <span class="p">[]</span>
<span class="p">}</span>

<span class="n">V</span> <span class="o">=</span> <span class="mi">4</span>  <span class="c1"># 图中有4个顶点
</span>
<span class="c1"># 运行Floyd-Warshall算法
</span><span class="n">dist</span> <span class="o">=</span> <span class="n">floyd_warshall</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">V</span><span class="p">)</span>

<span class="c1"># 输出最短路径矩阵
</span><span class="k">print</span><span class="p">(</span><span class="s">"从每个顶点到其他顶点的最短路径："</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="n">INF</span><span class="p">:</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"从 </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s"> 到 </span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s"> 没有路径"</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"从 </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s"> 到 </span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s"> 的最短路径为: </span><span class="si">{</span><span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>



</code></pre></div></div>

<h4 id="拓扑排序aov">拓扑排序AOV</h4>

<ul>
  <li>由于DFS的回溯特性，结果列表中的节点顺序正好是拓扑排序的逆序。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span><span class="p">,</span> <span class="n">defaultdict</span>
<span class="k">def</span> <span class="nf">dfs_topological_sort</span><span class="p">(</span><span class="n">V</span><span class="p">,</span> <span class="n">graph</span><span class="p">):</span>
    <span class="n">visited</span> <span class="o">=</span> <span class="p">[</span><span class="bp">False</span><span class="p">]</span> <span class="o">*</span> <span class="n">V</span>  <span class="c1"># 标记节点是否已访问
</span>    <span class="n">stack</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># 用于存储拓扑排序结果
</span>    <span class="n">on_stack</span> <span class="o">=</span> <span class="p">[</span><span class="bp">False</span><span class="p">]</span> <span class="o">*</span> <span class="n">V</span>  <span class="c1"># 用于检测图中是否有环
</span>    
    <span class="k">def</span> <span class="nf">dfs</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">on_stack</span><span class="p">[</span><span class="n">u</span><span class="p">]:</span>  <span class="c1"># 如果当前节点已经在栈中，说明图中有环
</span>            <span class="k">raise</span> <span class="nb">ValueError</span><span class="p">(</span><span class="s">"图中有环，无法进行拓扑排序"</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">visited</span><span class="p">[</span><span class="n">u</span><span class="p">]:</span>  <span class="c1"># 如果节点已经访问过，直接返回
</span>            <span class="k">return</span>
        <span class="n">visited</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="n">on_stack</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">graph</span><span class="p">[</span><span class="n">u</span><span class="p">]:</span>
            <span class="n">dfs</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
        <span class="n">on_stack</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">u</span><span class="p">)</span>  <span class="c1"># 将当前节点加入栈
</span>    
    <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">V</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">u</span><span class="p">]:</span>
            <span class="n">dfs</span><span class="p">(</span><span class="n">u</span><span class="p">)</span>
    
    <span class="c1"># 最后返回栈中逆序的结果即为拓扑排序
</span>    <span class="k">return</span> <span class="n">stack</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

<span class="c1"># 使用示例
</span><span class="n">V</span> <span class="o">=</span> <span class="mi">6</span>
<span class="n">graph</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>

<span class="c1"># 添加边（有向边）
</span><span class="n">graph</span><span class="p">[</span><span class="mi">5</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">graph</span><span class="p">[</span><span class="mi">5</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">graph</span><span class="p">[</span><span class="mi">4</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">graph</span><span class="p">[</span><span class="mi">4</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">graph</span><span class="p">[</span><span class="mi">2</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="n">graph</span><span class="p">[</span><span class="mi">3</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="c1"># 运行DFS算法
</span><span class="k">try</span><span class="p">:</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">dfs_topological_sort</span><span class="p">(</span><span class="n">V</span><span class="p">,</span> <span class="n">graph</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"拓扑排序结果:"</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>



</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>拓扑排序结果: [5, 4, 2, 3, 1, 0]
</code></pre></div></div>

<h4 id="关键路径aoe">关键路径AOE</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>


</code></pre></div></div>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[python数据结构+算法]]></summary></entry><entry><title type="html">Markdown</title><link href="https://delluna.github.io/posts/2026/03/Markdown" rel="alternate" type="text/html" title="Markdown" /><published>2026-03-08T00:00:00+00:00</published><updated>2026-03-08T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2026/03/Markdown</id><content type="html" xml:base="https://delluna.github.io/posts/2026/03/Markdown"><![CDATA[<p>discription</p>

<h1 id="markdown">Markdown</h1>

<h1 id="目录">目录</h1>

<ul>
  <li><a href="#markdown">Markdown</a></li>
  <li><a href="#目录">目录</a></li>
  <li><a href="#正文">正文</a>
    <ul>
      <li><a href="#1-markdown是什么">1. Markdown是什么？</a></li>
      <li><a href="#2-为什么要使用markdown">2. 为什么要使用Markdown？</a></li>
      <li><a href="#3-基础语法">3. 基础语法</a>
        <ul>
          <li><a href="#31-标题1-6级标题">3.1 标题（1-6级标题）</a></li>
          <li><a href="#32-列表无序列表有序列表任务列表">3.2 列表（无序列表、有序列表、任务列表）</a></li>
          <li><a href="#33-强调标记粗体斜体删除线下划线高亮隐藏">3.3 强调（标记、粗体、斜体、删除线、下划线、高亮、隐藏）</a></li>
          <li><a href="#34-分割线">3.4 分割线</a></li>
          <li><a href="#35-区块引用">3.5 区块引用</a></li>
          <li><a href="#36-代码区块">3.6 代码区块</a></li>
          <li><a href="#37-公式块">3.7 公式块</a></li>
          <li><a href="#38-链接行内式参考式脚注">3.8 链接（行内式、参考式、脚注）</a></li>
          <li><a href="#39-图片">3.9 图片</a></li>
          <li><a href="#310-表格">3.10 表格</a></li>
        </ul>
      </li>
      <li><a href="#4-其他语法">4. 其他语法</a>
        <ul>
          <li><a href="#41-目录">4.1 目录</a></li>
          <li><a href="#42-段落">4.2 段落</a></li>
          <li><a href="#43-转义符-">4.3 转义符 <code class="language-plaintext highlighter-rouge">\</code></a></li>
          <li><a href="#44-tex公式">4.4 Tex公式</a></li>
          <li><a href="#45-emoji表情">4.5 <strong>Emoji</strong> 表情</a></li>
        </ul>
      </li>
      <li><a href="#使用规范">使用规范</a></li>
      <li><a href="#常见问题">常见问题</a></li>
    </ul>
  </li>
</ul>

<h1 id="正文">正文</h1>

<h2 id="1-markdown是什么">1. Markdown是什么？</h2>

<p><strong>Markdown</strong>是一种<strong>轻量级标记语言</strong>，它以<strong>纯文本</strong>形式（易读、易写、易更改）编写文档，并最终以HTML格式发布。</p>

<h2 id="2-为什么要使用markdown">2. 为什么要使用Markdown？</h2>

<ul>
  <li>它是易读（看起来舒服）、易写（语法简单）、易更改的纯文本，处处体现着极简主义的影子。</li>
  <li>兼容HTML，可以转换为HTML格式发布。</li>
  <li>跨平台使用。</li>
  <li>越来越多的网站支持Markdown。</li>
  <li>AI时代下的Markdown越来越重要。</li>
</ul>

<h2 id="3-基础语法">3. 基础语法</h2>

<h3 id="31-标题1-6级标题">3.1 标题（1-6级标题）</h3>

<p>使用<code class="language-plaintext highlighter-rouge">#</code>，可表示1-6级标题。写法如下：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># 一级标题（下方自带分割线）</span>
<span class="gu">## 二级标题（下方自带分割线）</span>
<span class="gu">### 三级标题</span>
<span class="gu">#### 四级标题</span>
<span class="gu">##### 五级标题</span>
<span class="gu">###### 六级标题</span>
</code></pre></div></div>

<h3 id="32-列表无序列表有序列表任务列表">3.2 列表（无序列表、有序列表、任务列表）</h3>

<ul>
  <li><strong>无序列表：</strong>使用<code class="language-plaintext highlighter-rouge">-</code><strong>（推荐）</strong>、<code class="language-plaintext highlighter-rouge">+</code>或<code class="language-plaintext highlighter-rouge">*</code>标记，写法如下：</li>
</ul>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> 第一项
<span class="p">+</span> 第二项
<span class="p">*</span> 第三项
</code></pre></div></div>

<p><strong>注意：</strong>标记后面至少有一个空格。</p>

<ul>
  <li><strong>有序列表：</strong>使用数字，并辅以<strong><code class="language-plaintext highlighter-rouge">.</code></strong> ，写法如下：</li>
</ul>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">1.</span> 第一项
<span class="p">2.</span> 第二项
<span class="p">3.</span> 第三项
</code></pre></div></div>

<p><strong>注意：</strong>标记后面至少有一个空格。</p>

<ul>
  <li><strong>任务列表：</strong>使用<code class="language-plaintext highlighter-rouge">- [ ] 文本</code>和<code class="language-plaintext highlighter-rouge">- [x] 文本</code>，写法如下：</li>
</ul>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> [ ] 待完成项
<span class="p">-</span> [x] 已完成项
</code></pre></div></div>

<p><strong>注意：</strong>有多个空格。</p>

<h3 id="33-强调标记粗体斜体删除线下划线高亮隐藏">3.3 强调（标记、粗体、斜体、删除线、下划线、高亮、隐藏）</h3>

<ul>
  <li>标记：<code class="language-plaintext highlighter-rouge">标记</code></li>
  <li>斜体：<code class="language-plaintext highlighter-rouge">*斜体*</code>或<code class="language-plaintext highlighter-rouge">_斜体*</code></li>
  <li>粗体：<code class="language-plaintext highlighter-rouge">**粗体**</code>或<code class="language-plaintext highlighter-rouge">__粗体__</code></li>
  <li>粗斜体：<code class="language-plaintext highlighter-rouge">***粗斜体***</code>或<code class="language-plaintext highlighter-rouge">___粗斜体___</code></li>
  <li>删除线：<code class="language-plaintext highlighter-rouge">~~删除线~~</code></li>
  <li>下划线：<code class="language-plaintext highlighter-rouge">&lt;u&gt;下划线&lt;/u&gt;</code></li>
  <li>高亮：<code class="language-plaintext highlighter-rouge">==高亮文本==</code></li>
  <li>隐藏：<code class="language-plaintext highlighter-rouge">%%隐藏文本%%</code></li>
</ul>

<h3 id="34-分割线">3.4 分割线</h3>

<p>最常用的分割线是使用<strong>三个或以上</strong><code class="language-plaintext highlighter-rouge">*</code>，还可以使用<code class="language-plaintext highlighter-rouge">-</code>或<code class="language-plaintext highlighter-rouge">_</code>，写法如下：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh">***
---
</span><span class="ge">__</span>_
</code></pre></div></div>

<h3 id="35-区块引用">3.5 区块引用</h3>

<p>在段落的每行使用符号<code class="language-plaintext highlighter-rouge">&gt;</code>，还可使用多个嵌套引用，写法如下：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gt">&gt; 区块引用</span>
<span class="gt">&gt;&gt; 嵌套引用1</span>
<span class="gt">&gt;&gt;&gt; 嵌套引用2</span>
</code></pre></div></div>

<p><strong>注意：</strong>标记<code class="language-plaintext highlighter-rouge">&gt;</code>后面无需空格，但<strong>建议后面接一个空格</strong>。</p>

<h3 id="36-代码区块">3.6 代码区块</h3>

<p><strong>方式1：</strong>在段落的每行使用<strong>四个空格或一个制表符</strong>。</p>

<p><strong>方式2（推荐）：</strong>在代码前后各使用<strong>三个反引号</strong>```，可指定代码语言，写法如下：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>​<span class="sb">```</span>python
def main(){
   print("Hello World!")
}
</code></pre></div></div>

<h3 id="37-公式块">3.7 公式块</h3>

<ul>
  <li><strong>行内公式：</strong>使用<code class="language-plaintext highlighter-rouge">$</code>包围Tex公式，写法如下：</li>
</ul>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>这是一个行内公式$y=x+2$。
</code></pre></div></div>

<p><strong>注意：</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">$</code> 必须‌<strong>紧贴公式</strong>‌，前后不能有空格（否则可能无法识别）。</li>
  <li>公式内容需符合 LaTeX 语法。</li>
  <li>并非所有 Markdown 渲染器都原生支持数学公式，需确认平台是否启用 MathJax 或 KaTeX 等渲染引擎（如 Typora、Obsidian、Jupyter 支持；GitHub 默认不支持）‌</li>
  <li><strong>行间公式：</strong>使用<code class="language-plaintext highlighter-rouge">$$</code>包围Tex公式，写法如下：</li>
</ul>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$$
	y=(x+2)^2
$$
</code></pre></div></div>

<h3 id="38-链接行内式参考式脚注">3.8 链接（行内式、参考式、脚注）</h3>

<p><strong>行内式</strong>，写法如下<strong>：</strong></p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="nv">Delluna的个人网站</span><span class="p">](</span><span class="sx">https://delluna.github.io</span><span class="p">)</span>。
</code></pre></div></div>

<p><strong>参考式</strong>，写法如下<strong>：</strong></p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="nv">Delluna的个人网站</span><span class="p">][</span><span class="ss">1</span><span class="p">]</span>。
<span class="p">[</span><span class="ss">1</span><span class="p">]:</span><span class="sx">https://delluna.github.io</span>
</code></pre></div></div>

<p><strong>脚注：</strong>正文显示链接，底部显示注释，写法如下<strong>：</strong></p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>正文[^1]
<span class="p">[</span><span class="ss">^1</span><span class="p">]:</span><span class="sx">脚注</span>
</code></pre></div></div>

<h3 id="39-图片">3.9 图片</h3>

<p>使用<code class="language-plaintext highlighter-rouge">![]</code>，写法如下：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>![img_path]
</code></pre></div></div>

<h3 id="310-表格">3.10 表格</h3>

<p>用<code class="language-plaintext highlighter-rouge">|</code>表示表格纵向边界，表头和表内容用<code class="language-plaintext highlighter-rouge">-</code>隔开，并可用<code class="language-plaintext highlighter-rouge">:</code>进行对齐设置，两边都有<code class="language-plaintext highlighter-rouge">:</code>则表示居中，若不加<code class="language-plaintext highlighter-rouge">:</code>则默认左对齐。</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>|列标题1|列标题2|
|---|---|
|内容1|内容2|

<span class="gh"># (左对齐|居中|右对齐)</span>
|列标题1|列标题2|列标题3|
|:---|:---:|---:|
|内容1|内容2|内容3|
</code></pre></div></div>

<h2 id="4-其他语法">4. 其他语法</h2>

<h3 id="41-目录">4.1 目录</h3>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[toc]回车
</code></pre></div></div>

<h3 id="42-段落">4.2 段落</h3>

<p>段落的前后要有空行，所谓的空行是指没有文字内容。</p>

<p>段内强制换行的方式是使用<strong>两个以上空格加回车</strong>（引用中换行省略回车）</p>

<h3 id="43-转义符-">4.3 转义符 <code class="language-plaintext highlighter-rouge">\</code></h3>

<p>相当于<strong>反转义</strong>作用，使符号成为普通符号显示。如：<code class="language-plaintext highlighter-rouge">\#</code>，<code class="language-plaintext highlighter-rouge">\$</code>。</p>

<h3 id="44-tex公式">4.4 Tex公式</h3>

<ul>
  <li><strong>通用 LaTeX 数学公式语法手册：</strong><a href="http://www.uinio.com/Math/LaTex/">http://www.uinio.com/Math/LaTex/</a></li>
</ul>

<h3 id="45-emoji表情">4.5 <strong>Emoji</strong> 表情</h3>

<ul>
  <li>方式1：复制粘贴。参考表情库：
    <ul>
      <li><a href="https://emojipedia.org/">https://emojipedia.org/</a></li>
      <li><a href="https://www.webfx.com/tools/emoji-cheat-sheet/">https://www.webfx.com/tools/emoji-cheat-sheet/</a></li>
    </ul>
  </li>
  <li>方式2：键入<em>emoji shortcodes。</em>以冒号开头和结尾，并包含表情符号的名称。
    <ul>
      <li><a href="https://gist.github.com/rxaviers/7360908">https://gist.github.com/rxaviers/7360908</a></li>
    </ul>
  </li>
</ul>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>😄 :smile:
❤️ :heart:
👍 :+1:
👎 :-1:
🔥 :fire:
🔍 :mag:
🔒 :lock:
✅ :white_check_mark:
</code></pre></div></div>

<h2 id="使用规范">使用规范</h2>

<blockquote>

  <p><strong>Markdown官方教程：</strong><a href="https://markdown.com.cn/">https://markdown.com.cn/</a></p>

  <p><strong>Markdown 书写风格指南：</strong><a href="https://einverne.github.io/markdown-style-guide/zh.html">https://einverne.github.io/markdown-style-guide/zh.html</a></p>
</blockquote>

<h2 id="常见问题">常见问题</h2>

<ol>
  <li>github上的README.md无法显示[TOC]目录？
解决方案：<a href="https://blog.csdn.net/Lin_hahahaha/article/details/120577428">使用VSCode的Markdown All in One插件一键生成目录</a></li>
</ol>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[discription]]></summary></entry><entry><title type="html">Blog Post number 4</title><link href="https://delluna.github.io/posts/2012/08/blog-post-4/" rel="alternate" type="text/html" title="Blog Post number 4" /><published>2015-08-14T00:00:00+00:00</published><updated>2015-08-14T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2012/08/blog-post-4</id><content type="html" xml:base="https://delluna.github.io/posts/2012/08/blog-post-4/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry><entry><title type="html">Blog Post number 3</title><link href="https://delluna.github.io/posts/2014/08/blog-post-3/" rel="alternate" type="text/html" title="Blog Post number 3" /><published>2014-08-14T00:00:00+00:00</published><updated>2014-08-14T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2014/08/blog-post-3</id><content type="html" xml:base="https://delluna.github.io/posts/2014/08/blog-post-3/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry><entry><title type="html">Blog Post number 2</title><link href="https://delluna.github.io/posts/2013/08/blog-post-2/" rel="alternate" type="text/html" title="Blog Post number 2" /><published>2013-08-14T00:00:00+00:00</published><updated>2013-08-14T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2013/08/blog-post-2</id><content type="html" xml:base="https://delluna.github.io/posts/2013/08/blog-post-2/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry><entry><title type="html">Blog Post number 1</title><link href="https://delluna.github.io/posts/2012/08/blog-post-1/" rel="alternate" type="text/html" title="Blog Post number 1" /><published>2012-08-14T00:00:00+00:00</published><updated>2012-08-14T00:00:00+00:00</updated><id>https://delluna.github.io/posts/2012/08/blog-post-1</id><content type="html" xml:base="https://delluna.github.io/posts/2012/08/blog-post-1/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Delluna</name><email>w1296524574@gmail.com</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry></feed>