算法好坏
时间复杂度:运行时间长短 大O表示法:只保留时间函数中的最高阶项且去掉系数
空间复杂度:占用内存大小
算法稳定性
稳定: 如果a原本在b前面,而a=b,排序之后a仍然在b的前面
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面
常见算法:
字符串:暴力匹配、BM、KMP、Trie等。
查找:二分查找、遍历查找等。
排序:冒泡排序、快排、计数排序、堆排序等。
搜索:TFIDF、PageRank等。
聚类分析:期望最大化、k-meanings、k-数位等。
深度学习:深度信念网络、深度卷积神经网络、生成式对抗等。
异常检测:k最近邻、局部异常因子等。
常见数据结构:
数组: 有限个相同类型的变量所组成的有序集合
链表: 在物理上非连续、非顺序的数据结构,由若干个节点组成
栈: 后进先出
队列: 后进后出
哈希表:本质上是一个数组,通过哈希函数,我们可以把字符串或其他类型的key,转化成数组的下标index
哈希冲突:不同的key通过哈希函数获得的下标有可能是相同的,例如002936这个key对应的数组下标是2,002947对应的数组下标也是2,这种情况就是哈希冲突。
如何解决哈希冲突:开放寻址法:例子Threadlocal;链表法:例子Hashmap。
树:
深度优先:前序(根节点、左子树、右子树),中序(左子树、根节点、右子树),后序(左子树、右子树、根节点)
广度优先:一层一层遍历
二叉树:(树的每个节点最多有俩个孩子节点)
满二叉树:每个非叶子结点都有俩个孩子节点
完全二叉树:按广度优先和同样深度的满二叉树节点相同位置编号相同
二叉查找树:(所有节点:左<根<右)
如果左子树不为空,则左子树上所有节点的值均小于根节点的值
如果右子树不为空,则右子树上所有节点的值均大于根节点的值
备注:二叉查找树就是二叉树的中序遍历
作用:查找==》二分查找;排序==》中序遍历
二叉堆:(特殊的二叉树)
最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值
最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值
最小堆的插入:插入最末,节点上浮
最小堆的删除:删除头节点,尾节点放到头部,再下沉
二叉树构建二叉堆:所有非叶子节点依次下沉
常见排序:
插入 稳定
希尔
选择
堆
冒泡 稳定 比较相邻的元素。如果第一个比第二个大,就交换它们两个,每一轮从左到右依次
快速 俩个游标
归并 稳定 先拆再合
计数 稳定
桶 稳定 创建桶,区间跨度=(最大值-最小值)/(桶的数量-1),遍历数列,对号入座,每个桶内进行排序,可选择快排等,遍历所有的桶,输出所有元素
基数 稳定