算法基础简单整理
-
排序算法html
-
选择排序算法
- 每次选最小的放到最前面。一种naive的排序,没有实际用途。
-
插入排序数组
- 每次将新的数据插在合适的位置。经过插入的方式在收到新数据时维护数据的顺序,至关于把排序的损耗分散到数据输入时。但单纯用来排序是意义不大的。
-
希尔排序性能
- 一种优化的插入排序。按必定步长将数组分红K组,在每组内进行插入排序;逐步缩小步长直至1。数据量比较小时性能比较好,但最坏时间复杂度还是O(N^2)的。
-
归并排序优化
- 递归地将数组分红两部分排好序再合并。时间复杂度O(NlogN)。稳定的。
-
快速排序编码
- 取一个数,将比这个数小的放左边,大的放右边;重复这一过程。不稳定。平均复杂度为O(nlogn),最坏为O(n^2)
-
堆排序.net
- 堆是一种彻底二叉树:每一个结点的值都大于或等于其子节点的值,称为大顶堆。反之为小顶堆。
- 将待排序序列构造为一个大顶堆,取走根节点;将剩余元素从新构造大顶堆;重复这一过程。
- 复杂度O(nlogn),不稳定
-
依赖数据范围的排序算法htm
-
计数排序blog
- 数组长度是数据范围,把全部数据放进去,天然排好序。复杂度O(n+k),其中k是数组长度。
-
基数排序排序
- 对k位数,每一位进行排序。复杂度是O(k*n),若是数据范围为N,十进制时k就是logN,大部分实际场景下N是int32或int64,这样致使实际复杂度大于O(nlogn)。
-
桶排序
- 每一个桶对应必定的数据范围,把数据放到不一样的桶里,而后对每一个桶内进行排序。
-
查找
- 二分查找:略
- 二叉树:略
-
二叉排序树(二叉查找树/二叉搜索树)
- 性质:左子树全部节点都小于根节点,右子树全部节点都大于根节点。
- 查找的平均复杂度是O(logn)的,这个跟通常的二分查找同样;但它插入复杂度也是O(logn)的,这就是优势了。
- 哈夫曼树/哈夫曼编码:参考https://blog.csdn.net/FX677588/article/details/70767446
-
平衡二叉树
- 性质:左子树和右子树的深度之差不超过1
- 目的:为了防止树极度不平衡的极端场景出现
- 实现:AVL树、红黑树
-
B树
- 每一个节点最多有m-1个关键字;每一个节点的关键字从小到大排序,每一个关键字的左子树中全部关键字都小于它,而右子树中的全部关键字都大于它。
- 能够理解为二叉搜索树的推广形态。当m=2时,即二叉搜索树。
- B+树:B树的推广,内部节点不保存数据,只用于索引,全部数据都保存在叶子节点。
-
字典树(Trie树)
- 每一个节点表明一个字符,有相同前缀的单词有公共的前缀节点。
- 查询、插入复杂度都是O(L),L是字符串长度
- 散列表:略
-
字符串
-
字符串匹配KMP算法
- 相似状态机的方式,参考字符串匹配的KMP算法
-
最长公共子串 / 最长公共子序列
- 都是dp,参考动态规划:最长公共子串 & 最长公共子序列
-
图
欢迎关注本站公众号,获取更多信息