算法

排序

冒泡排序 选择排序 插入排序 归并排序

JS 快排

Array.prototype.quickSort = function() {
  if (this.length < 2) {
    return this;
  }
  return [...this.filter(el => el < this[0]).quickSort(), this[0], ...this.filter((el, i) => el >= this[0] && i !== 0).quickSort()];
};

http://blog.csdn.net/k346k346/article/details/50791102

https://www.cnblogs.com/eniac12/p/5329396.html

1

1.2.1 二分法

有序列表

log_2 n
1.2.2 运行时间

线性时间 对数时间

1.3 大O

大O表示最糟的情形

  1. 二分法
O(log n)
  1. 简单查找(线性时间)
O(n)
  1. 快速排序平均情况
O(n * log n) 
  1. 选择排序
O(log n^2)
  1. 旅行商(排列组合)
O(n!)

2 选择排序

2.2 数组和链表

2.2.1 链表
2.2.2 数组
2.2.3 术语

数组带索引,所以在读取的时候比链表快。

2.2.4 在中间插入
2.2.5 删除
- 数组 链表
读取 O(1) O(n)
插入 O(n) O(1)
插入 O(n) O(1)
  • 随机访问 → 数组
  • 顺序访问 → 链表

2.3 选择排序

O(n^2)

3 递归

3.3 栈

是一种数据结构

3.3.1 调用栈

4 快速排序

分而治之(divide and conquer, D & C)著名的递归问题解决方法

4.1 分而治之

1 找出简单的基线条件
2 确定如何缩小问题的规模,使其符合基线条件

D&C 并非可用于解决问题的算法,而是一种解决问题的思路。

4.2 快速排序

基准值 pivot
分区 partitioning
  1. 选择基准值
  2. 将数组分成两个子数组
  3. 对两个子数组快速排序

4.3 再谈大O表示法

合并排序(merge sort)

O(n * log n)
4.3.2 平均情况和最糟情况

5 散列表(hash table)

5.1 散列函数

Python 字典(dict)实现了散列表

5.2.2 防止重复

使用散列表防止重复

5.2.3 用散列表用作缓存 ✖

5.3 冲突

5.4 性能

5.4.1 填装因子

0.7

5.4.2 良好的散列函数

将每个字符都映射到一个素数:a = 2, b = 3, c = 5 … 对于给定字符串,将每个字符对应的素数相加,再除以散列表长度,取余。

6 广度优先搜索

6.1 图简介

最短路径问题(shorter-path problem)

6.2 图是什么

节点,边

图用于模拟不同的东西是如何相连的。

6.3 广度优先搜索

  • 从节点A到节点B有路径吗?
  • 从节点A到节点B哪条路径最短?
6.3.1 查找最短路径
6.3.2 队列(queue)

先进先出(FIFO)

6.4 实现图

有向图(directed graph) 无向图(undirected graph)

6.5 实现算法

运行时间

O(V + E)

拓扑排序

7 戴克斯特拉算法(Dijkstra's algorithm)

1 找出最便宜的节点,即可在最短时间内到达的节点
2 更新该节点的邻居的开销,检查是否有前往他们的更短路径,如果有,就更新开销
3 重复这个过程,知道对途中每个节点都这样做了
4 计算最终路径

7.2 术语

权重(weight)

加权图(weighted graph)、非加权图

环,增加了权重

戴克斯特拉算法只适用于有向无环图

7.3 换钢琴

7.4 负权边

贝尔曼-福德算法(Bellman-Ford algorithm)?

7.5 实现

https://www.cnblogs.com/jiqingwu/p/bubble_sort_analysis.html https://www.cnblogs.com/qiaozhoulin/p/4808285.html https://blog.csdn.net/qq_36470686/article/details/82846427 https://blog.csdn.net/thomasli2017/article/details/77422323

更新时间:2025-03-13 13:15:24