mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-25 10:36:28 +08:00
Remove the file headers from the docs.
This commit is contained in:
parent
2b33f7bc5f
commit
b25aadae6f
44 changed files with 0 additions and 176 deletions
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 数组
|
||||
|
||||
「数组 Array」是一种将 **相同类型元素** 存储在 **连续内存空间** 的数据结构,将元素在数组中的位置称为元素的「索引 Index」。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 链表
|
||||
|
||||
!!! note "引言"
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 列表
|
||||
|
||||
**由于长度不可变,数组的实用性大大降低**。在很多情况下,我们事先并不知道会输入多少数据,这就为数组长度的选择带来了很大困难。长度选小了,需要在添加数据中频繁地扩容数组;长度选大了,又造成内存空间的浪费。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
- 数组和链表是两种基本数据结构,代表了数据在计算机内存中的两种存储方式,即连续空间存储和离散空间存储。两者的优点与缺点呈现出此消彼长的关系。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 算法效率评估
|
||||
|
||||
## 算法评价维度
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 空间复杂度
|
||||
|
||||
「空间复杂度 Space Complexity」统计 **算法使用内存空间随着数据量变大时的增长趋势**。这个概念与时间复杂度很类似。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 权衡时间与空间
|
||||
|
||||
理想情况下,我们希望算法的时间复杂度和空间复杂度都能够达到最优,而实际上,同时优化时间复杂度和空间复杂度是非常困难的。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
### 算法效率评估
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 时间复杂度
|
||||
|
||||
## 统计算法运行时间
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 数据结构分类
|
||||
|
||||
数据结构主要可根据「逻辑结构」和「物理结构」两种角度进行分类。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 数据与内存
|
||||
|
||||
## 基本数据类型
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
- 整数 byte, short, int, long 、浮点数 float, double 、字符 char 、布尔 boolean 是计算机中的基本数据类型,占用空间的大小决定了它们的取值范围。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 图
|
||||
|
||||
「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 $G$ 抽象地表示为一组顶点 $V$ 和一组边 $E$ 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 图基础操作
|
||||
|
||||
图的基础操作分为对「边」的操作和对「顶点」的操作,在「邻接矩阵」和「邻接表」这两种表示下的实现方式不同。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 图的遍历
|
||||
|
||||
!!! note "图与树的关系"
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 哈希冲突
|
||||
|
||||
理想情况下,哈希函数应该为每个输入产生唯一的输出,使得 key 和 value 一一对应。而实际上,往往存在向哈希函数输入不同的 key 而产生相同输出的情况,这种情况被称为「哈希冲突 Hash Collision」。哈希冲突会导致查询结果错误,从而严重影响哈希表的可用性。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 哈希表
|
||||
|
||||
哈希表通过建立「键 key」和「值 value」之间的映射,实现高效的元素查找。具体地,输入一个 key ,在哈希表中查询并获取 value ,时间复杂度为 $O(1)$ 。
|
||||
|
|
|
@ -1,5 +1 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 堆
|
||||
|
||||
「堆 Heap」是一棵限定条件下的「完全二叉树」。根据成立条件,堆主要分为两种类型:
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 算法无处不在
|
||||
|
||||
听到“算法”这个词,我们一般会联想到数学。但实际上,大多数算法并不包含复杂的数学,而更像是在考察基本逻辑,而这些逻辑在我们日常生活中处处可见。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 算法是什么
|
||||
|
||||
## 算法定义
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 关于本书
|
||||
|
||||
五年前发生的一件事,成为了我职业生涯的重要转折点。当时的我在交大读研,对互联网求职一无所知,但仍然硬着头皮申请了 Microsoft 软件工程师实习。面试官让我在白板上写出“快速排序”代码,我畏畏缩缩地写了一个“冒泡排序”,并且还写错了` (ToT) ` 。从面试官的表情上,我看到了一个大大的 "GG" 。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 一起参与创作
|
||||
|
||||
!!! success "开源的魅力"
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 编程环境安装
|
||||
|
||||
(TODO 视频教程)
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 如何使用本书
|
||||
|
||||
## 图文搭配学
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二分查找
|
||||
|
||||
「二分查找 Binary Search」利用数据的有序性,通过每轮缩小一半搜索区间来查找目标元素。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 哈希查找
|
||||
|
||||
!!! question
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 线性查找
|
||||
|
||||
「线性查找 Linear Search」是一种最基础的查找方法,其从数据结构的一端开始,依次访问每个元素,直到另一端后停止。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
- 线性查找是一种最基础的查找方法,通过遍历数据结构 + 判断条件实现查找。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 冒泡排序
|
||||
|
||||
「冒泡排序 Bubble Sort」是一种最基础的排序算法,非常适合作为第一个学习的排序算法。顾名思义,「冒泡」是该算法的核心操作。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 插入排序
|
||||
|
||||
「插入排序 Insertion Sort」是一种基于 **数组插入操作** 的排序算法。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 排序简介
|
||||
|
||||
「排序算法 Sorting Algorithm」使得列表中的所有元素按照从小到大的顺序排列。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 归并排序
|
||||
|
||||
「归并排序 Merge Sort」是算法中“分治思想”的典型体现,其有「划分」和「合并」两个阶段:
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 快速排序
|
||||
|
||||
「快速排序 Quick Sort」是一种基于“分治思想”的排序算法,速度很快、应用很广。
|
||||
|
|
|
@ -1,6 +1,2 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 双向队列
|
||||
|
||||
对于队列,我们只能在头部删除或在尾部添加元素,而「双向队列 Deque」更加灵活,在其头部和尾部都能执行元素添加或删除操作。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 队列
|
||||
|
||||
「队列 Queue」是一种遵循「先入先出 first in, first out」数据操作规则的线性数据结构。顾名思义,队列模拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 栈
|
||||
|
||||
「栈 Stack」是一种遵循「先入后出 first in, last out」数据操作规则的线性数据结构。我们可以将栈类比为放在桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
- 栈是一种遵循先入后出的数据结构,可以使用数组或链表实现。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# AVL 树 *
|
||||
|
||||
在「二叉搜索树」章节中提到,在进行多次插入与删除操作后,二叉搜索树可能会退化为链表。此时所有操作的时间复杂度都会由 $O(\log n)$ 劣化至 $O(n)$ 。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二叉搜索树
|
||||
|
||||
「二叉搜索树 Binary Search Tree」满足以下条件:
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二叉树
|
||||
|
||||
「二叉树 Binary Tree」是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。类似于链表,二叉树也是以结点为单位存储的,结点包含「值」和两个「指针」。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二叉树遍历
|
||||
|
||||
从物理结构角度看,树是一种基于链表的数据结构,因此遍历方式也是通过指针(即引用)逐个遍历结点。同时,树还是一种非线性数据结构,这导致遍历树比遍历链表更加复杂,需要使用搜索算法来实现。
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
- 二叉树是一种非线性数据结构,代表着“一分为二”的分治逻辑。二叉树的结点包含「值」和两个「指针」,分别指向左子结点和右子结点。
|
||||
|
|
Loading…
Reference in a new issue