Commit d7d34987 authored by WAAutoMaton's avatar WAAutoMaton
Browse files

feat: 修改堆条目结构

parent ed60f963
Loading
Loading
Loading
Loading
+2 −32
Original line number Diff line number Diff line
## 堆
 
堆是一种数据结构,维护一个数的集合(或者,一个支持比较的元素的集合)。

主要功能有:insert, getmin, deletemin, decreasekey。

注意:简单起见,我们这里讨论的都是维护最小值的堆,也叫小根堆,与之相对的叫做大根堆。

一些功能强大的堆还能(高效地)支持 merge 等操作。

一些功能更强大的堆还支持可持久化,也就是对任意历史版本进行查询或者操作,产生新的版本。

## 堆的分类

一个有趣的事实是,这些堆都是用基于树的数据结构实现的。

在 NOIP 中,我们只要求一个能支持主要操作的堆就行,也就是二叉堆。

-   二叉堆_(binary heap)_

最基础的堆,不支持 merge 和可持久化,所有操作的复杂度都是 $O(\log n)$ 的。

-   二项堆_(binomial heap)_

支持 merge 的堆,(也能可持久化),所有操作的复杂度都是 $O(\log n)$ 。

-   Fib 堆_(Fibonacci heap)_

除了不能可持久化,支持全部功能,而且除了 deletemin 以外都是均摊 $O(1)$ 的。

## 二叉堆

### 结构

docs/ds/heap/heap.md

0 → 100644
+24 −0
Original line number Diff line number Diff line
堆是一种数据结构,维护一个数的集合(或者,一个支持比较的元素的集合)。

主要功能有:insert, getmin, deletemin, decreasekey。

注意:简单起见,我们这里讨论的都是维护最小值的堆,也叫小根堆,与之相对的叫做大根堆。

一些功能强大的堆还能(高效地)支持 merge 等操作。

一些功能更强大的堆还支持可持久化,也就是对任意历史版本进行查询或者操作,产生新的版本。

## 堆的分类

|          操作\数据结构          |                            配对堆                            |        二叉堆        |        左偏树        |        二项堆        |      斐波那契堆      |
| :-----------------------------: | :----------------------------------------------------------: | :------------------: | :------------------: | :------------------: | -------------------- |
|         插入(insert)          |                           $ O(1)$                            |     $ O(\log n)$     |     $ O(\log n)$     |     $O(1)$     |       $ O(1)$        |
|     查询最小值(find-min)      |                           $ O(1)$                            |       $ O(1)$        |       $ O(1)$        | $O(\log n)$ |  $O(1)$  |
|    删除最小值(delete-min)     |                     $ O(\log n)$                     | $ O(\log n)$ | $ O(\log n)$ | $O(\log n)$ | $ O(\log n)$ |
|          合并 (merge)           |                       $ O(1)$                        |   $ O(n)$    | $ O(\log n)$ | $O(\log n)$ |   $ O(1)$    |
| 减小一个元素的值 (decrease-key) | $o(\log n) (下界\Omega(\log \log n) ,\\\\上界 O(2^{2\sqrt{\log \log n}}) )$ | $ O(\log n)$ |  $ O(logn)$  | $O(\log n)$ |   $ O(1)$   |
|        是否支持可持久化         |                           $\times$                           |     $\checkmark$     |          $\checkmark$          |                    | $\times$ |

一个有趣的事实是,这些堆都是用基于树的数据结构实现的。

在 OI 中,最常用的堆是二叉堆,习惯上不加限定提到“堆”时往往也指二叉堆。
 No newline at end of file
+2 −0
Original line number Diff line number Diff line
 
+10 −4
Original line number Diff line number Diff line
@@ -151,7 +151,10 @@ nav:
    - 链表: ds/linked-list.md
    - 哈希表: ds/hash.md
    - 并查集: ds/dsu.md
    - : ds/heap.md
    - :
      - 堆简介: ds/heap/heap.md
      - 二叉堆: ds/heap/binary-heap.md
      - 配对堆: ds/heap/pairing-heap.md
    - 块状数据结构:
      - 分块思想: ds/square-root-decomposition.md
      - 块状链表: ds/block-list.md
@@ -256,7 +259,10 @@ nav:

# Theme
theme:
  name: 'material'
  name: null
  custom_dir: 'mkdocs-material/material'
  static_templates:
    - 404.html
  language: 'zh'
  palette:
    primary: 'white'
@@ -281,12 +287,12 @@ extra:
  copyright: '<a href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh">CC BY-SA 4.0</a>  <a href="https://github.com/zTrix/sata-license">SATA</a>'
  pagetime: 'on'
  manifest: 'manifest.webmanifest'
  githash: ''
  githash: 'ed60f96'

extra_javascript:
  - 'https://cdnjs.loli.net/ajax/libs/Han/3.3.0/han.min.js'
  - '_static/js/extra.js?v=10'
  - 'https://cdnjs.loli.net/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML'
  


extra_css: